Thank you for taking the time to write down your thoughts. BUILDR-274 is very much something we want to get to eventually.
Maven supports version ranges. How they do it might be different from the behavior you describe. I need to compare both, did you by any chance look into that? > On Oct 7, 2016, at 22:06, Trejkaz <trej...@trypticon.org> wrote: > > Continuing from https://issues.apache.org/jira/browse/BUILDR-274 > > Let's suppose that version ranged dependencies don't exist. > Let's also suppose that: > > * Library A depends on Library C 1.0. > * Library B depends on Library C 1.1. > * The changes from C 1.0 to C 1.1 were done according to semver (all > libraries should be doing this), and therefore code written to 1.0 > will work against 1.1. > > Now suppose your application wants to depend on both A and B. Now you > have a transitive dependency on both C 1.0 and 1.1. If you're using > OSGi, this _may_ be okay, though there are cases where it is not - for > instance, if two libraries are expected to pass between themselves > objects of a class defined in a third. If you're not using OSGi or a > similar runtime which allows running two different versions of the > same library, now you can't run your code. If you have an application > with a large number of dependencies, you end up having to go to > multiple libraries and begging them to update to some minor patch > release just so that your build can resolve the dependencies. > > The problem, as I see it, is that A doesn't _really_ depend on C 1.0. > > By definition, C 1.1 introduced backwards-compatible changes, so A > should also work against C 1.1. _If_ A also works against C 1.1, then > saying it depends on 1.0 is a lie. As a library developer, I would > prefer to specify my dependencies in a way which represents what I > actually support, even if the build only runs against one specific > version of it. Compiling should be done against the _lowest_ version > in the supported range, if it isn't checked against all of them. > *Ideally*, tests should be run against all combinations of > dependencies. I do see some projects doing this, presumably to be > doubly-sure that their dependencies are correct. > > An an application developer and someone who wants to build the > integrated project, I would like all libraries to declare their > dependencies accurately, so that the build tool can reliably detect > actual conflicts. If B suddenly starts depending on C 2.0, I want to > know about that. But today's build tools only give me two > unsatisfactory options: > (a) All your versions have to match, which they never do, so your > build is always conflicting, and you have to manually inspect other > people's code to see whether it will work with a newer version or not. > (b) Allow versions not to match, but when they clash, always pick > the latest one, and eventually you will get some NoClassDefFoundError > when someone accidentally updates a library which another library > actually needed. > > Accurately specified dependencies should also not make my build > unreproducible, as implied by the comment on the ticket. There are > multiple reasons why: > > 1. As long as nobody is specifying open-ended version ranges, it > shouldn't even be possible for a new incompatible version to suddenly > break the build. You should only be specifying dependencies you have > actually tested anyway. > > 2. If you update a library and the dependency of the updated version > was a newer version of some other library, the build didn't break > because of version ranges, it broke because you actually changed > something. > > 3. Even problems of specifying open-ended version ranges have been > solved by other dependency-resolution systems. For instance, RubyGems > keeps a "lock" file which contains the actual versions of everything > used last build, so the next build will use those versions until > someone actually updates something deliberately. It seems to be > working. > > > TX