Hi guix-devel,

I have been working recently on packaging Ruby gems. There is a particular
feature I have been unable to replicate, namely that gems declare their
dependencies with both a symbolic name and a version range. For example,
sinatra 4.1.1 depends on logger >= 1.6.0. Gems also declare which version of
Ruby they depend on, which I think can be an arbitrary version (not just "is
it 2 or 3").

My understanding is that guix deals with this the same way other distribution
package managers do, by hacking the symbolic mechanism to work: a human
identifies a "best possible" list of versions that build everything people
seem to care about, and the whole system rolls forward together. This is
appealing from a testing perspective, because there are less possible
configurations an installed system can be in.

However, I think this is unnecessarily limiting. It means that while guix can in principle be used to replace distribution package managers, it could never
be used to replace something like bundler. That's unfortunate, because
language package managers like bundler are themselves limited in that they
generally do not package system dependencies, meaning the dependency tree is
not complete & you have to rely on multiple package managers. I don't think
the "symbolic" mechanism can be made to work for this problem in general,
because the space of requirements is really large.

The approach I have been working with in my projects is to write a
symbolic package for every single version, and pin the entire dependency tree
with a manifest.scm file. This does work, but a) requires the use of an
external dependency resolution tool in order to compute the versions, and b)
means that the package definitions are not complete in isolation. This means
that if I give an incorrect version list (which is easy to do, especially if
you depend on both ruby gems and system libs) guix will not build a working
system.

I am writing to ask whether something like this has been considered
previously, and especially whether it is known to be a dead end. I don't know
whether the nix people have tried something similar, everything I could find
seems to be about generating lockfiles/manifests.

Best wishes,
Dan Littlewood


Reply via email to