&gt; Functional package managers are nice, as are reproducible builds, but they come up short for customizability. I&#x27;d have to write an awful lot of packages with Nix and Guix to try out many different versions, compilers, dependencies, etc.<p>I disagree.  At least with Guix you have <i>programmatic</i> access to the dependency graph (since package objects are just Scheme values).  You can traverse the package graph and easily swap out all occurrences of a particular package.  You do not have to write the package expressions yourself as you can just modify the package objects directly.<p>See also the paper &quot;Reproducible and User-Controlled Software Environments in HPC with Guix&quot;[1].<p>Since the paper was published Guix also gained command-line syntax to rewrite the dependency graph on the fly, e.g.<p><pre><code>    guix build guix --with-input=guile=guile-next
</code></pre>
which maps the &quot;guile&quot; input to &quot;guile-next&quot; when building the &quot;guix&quot; package.  Recent versions contain a pretty generic package transformation framework.<p>[1] <a href="https:&#x2F;&#x2F;hal.inria.fr&#x2F;hal-01161771&#x2F;en" rel="nofollow">https:&#x2F;&#x2F;hal.inria.fr&#x2F;hal-01161771&#x2F;en</a>