I’m not sure how to formulate this question/issue, I try to be as straightforward as possible.
So I have two packages developed by myself (both are public, hosted on github). I started developing PackageA
and at some point made a tag, let’s call it tagofA
(then continued developing). Then I started developing PackageB
which has PackageA
as dependency, and I added the version of the tag (tagofA
) as the version of the dependency. My issue is, that now, that both packages are ]dev
-ed, and the tag is added as dependency, it seems, that using PackageB
loads the dev-ed version of PackageA
.
So I,
-
]dev
-ed PackageA
-
]dev
-ed PackageB
- added
PackageA#tagofA
as dependency to PackageB
- and
using PackageB
loads the ]dev
-ed version of PackageA
insted of the tagofA
.
Both packaged are ]dev
-ed in the main Julia 1.3. environment, on Windows10. I skimmed through the documentation of Pkg, searching for the develop keyword, but did not find anything useful.
Is this the expected behavior or is it a bug? Or am I missing something?
How are you specifying the version of PackageA
in PackageB
? The reason I’m asking is that if you specify just the plain version number, all versions after that that aren’t supposed to be breaking are allowed, e.g. when you specify 1.0.0, 1.0.2 or 1.3.2 are allowed as well. This is explained pretty well in the Pkg docs here:
https://julialang.github.io/Pkg.jl/v1/compatibility/
If you don’t want that, you can restrict the allowed versions further either with ~1.0.0
or, even more restrictive =1.0.0
.
Edit:
This would go under the [compat]
section in your Project.toml
file of ProjectB
. If you only added the dependency in the pkg>
REPL, then you probably don’t have a compat entry and need to add it.
1 Like
You don’t add a version of a package as a dependency, only the package itself. The version you get is what the resolver (the thing that figures out versions) gives you. The version information is stored in the Manifest.toml
file. The manifest file of dependent packages is not used, only the manifest file of the current project is used. Therefore, since you have PackageA
developed in your current project, that is also the version of PackageA
that will be loaded.
Also, note that there will ever only be one version of a package loaded in a given Julia session.
3 Likes
I thought I specified by addig the package to the PackageB
environment by ]add PackageA#tagofA
. As the version I want to use is tagged with version number, but with a name, I don’t think I can specify it with a [compat]
entry.
Thank you, this make sense!
This makes sense, but was not immediately obvious to me. I had a package (Package
) that in it’s manifest declared the use of a fork of a dependency (Dependency
). A project (project
) using Package
then will have to also specify the fork of Dependency
in its manifest file, otherwise the non fork will be installed when doing instantiate -m
on the project
manifest.
(related to our brief discussion we forgot about on slack the other day, Kristoffer)
Question: If I in Package
want to enforce the fork of Dependency
being used, is the correct way forward to pin Dependency
in Package
’s environment?
I don’t really understand what “in ‘Package’” means. The version/fork of ‘Dependency’ that will be used is the one in the manifest for your current active project (the one showed by ‘status -m’)
I mean that Package
is only compatible with the fork, so any project using Package
must get the fork installed. If I in the package environment add the fork, this is not enough, as projects adding the package still get the non fork dependency in their Manifest.
Pkg doesn’t know about forks. It nows about packages (identified by UUID) and versions. So in this case, changing the UUID for the fork and depending on that should work.
1 Like