[compat] resolution logic; unsatisfiable requirement that should work?

Summary of below: How do I resolve this [compat] and Manifest.toml conflict, and how do I keep it from happening again?


I have a package that depends on Distributions.jl. Currently its [compat] entry contains this:

[compat]
julia = "1"
Distributions="0.21"

The compat for Distributions.jl 0.21 is

[compat]
julia = "1"
SpecialFunctions = "0.8,0.9"

The compat for SpecialFunctions.jl is 0.9 is

[compat]
julia = "1"

As a result, my code ran on Julia 1 with Distributions.jl 0.21 and SpecialFunctions.jl 0.9.

Then I went to bump Distributions.jl up to 0.22 in my package’s compat entry. It’s compat entry adds SpecialFunctions.jl 0.10 but retains 0.8 and 0.9.

Now my package won’t run on Julia 1.0, says that there is an unsatisfiable requirement:

ERROR: Unsatisfiable requirements detected for package SpecialFunctions [276daf66]:
 SpecialFunctions [276daf66] log:
 ├─possible versions are: [0.7.0-0.7.2, 0.8.0, 0.9.0, 0.10.0-0.10.3] or uninstalled
 ├─restricted to versions 0.10.3 by an explicit requirement, leaving only versions 0.10.3
 └─restricted by julia compatibility requirements to versions: [0.7.0-0.7.2, 0.8.0] or uninstalled — no versions left

When I made this change locally, the only packages that upgraded were Distributions.jl (to 0.22.6) and SpecialFunctions.jl (to 0.10.3). While Distributions.jl 0.22 is fine with julia 1.0, SpecialFunctions.jl 0.10.3 requires julia 1.3.

In theory though it should be able to fall back to SpecialFunctions.jl 0.8.

I was trying to figure out where this requirement from coming from, and I see that Manifest.toml lists the specific version number for SpecialFunctions.jl as 0.10.3.

My questions then are:

  • How do I resolve this issue so that it can run on Julia 1.0?
  • Why did it occur, so that I can keep it from becoming an issue again?

Did you by any chance pin to this version (pinned = true in the manifest) or edit the Manifest.toml directly? I would consider just deleting the whole Manifest.toml file and do a pkg> resolve, in case it got corrupted.

(Of course backup first if you ever need to reproduce that state if it is not in version control).

1 Like

Should I even have a Manifest.toml file? I noticed Distributions.jl doesn’t have one.

In 1.0, the packages in the Project (the explicit dependencies) where kind of restricted in how their version was allowed to change. This has been changed in later Julia versions so the resolver in 1.0 can feel more restrictive.

3 Likes

Thanks all. I deleted Manifest.toml, but it regenerated identically. So I added it to .gitignore and deleted it from the repository, and that worked!

The resolver will generate one for the active project. I was assuming that you are working on your activated package.

1 Like

Yeah I was. I didn’t really know what the file was for.