Handling various types of dependencies

I think you can find an answer in this comparison of Julia’s Pkg to Go’s packaging system:

Go is treating packages with different major versions as essentially different packages. So the above scenario would have “worked” in the sense that PkgC would load PkgB 2.0 instead of PkgB 1.9.