Prevent Mix from fetching dependencies

Hi!

The objective is to prevent Mix from fetching dependencies and to rely solely on ERL_LIBS. The idea is that all dependencies are already available through ERL_LIBS, which have been added by Guix.

However, the issue arises when using mix compile. It attempts to fetch dependencies regardless of existing settings. Currently, no option prevents this behavior; it always tries and subsequently fails. A potential workaround is to patch mix.exs so that the project() function returns a key/value list with the deps key set to [].

For instance, in the Mix project named makeup, there isn’t a straightforward method to instruct mix to avoid fetching nimble_parsec, even when it’s already available in ERL_LIBS:

β”Œβ”€β”€β”€β”€
β”‚ $ mix compile --no-deps-check
β”‚ Could not find Hex, which is needed to build dependency :nimble_parsec
β”‚ Shall I install Hex? (if running non-interactively, use "mix local.hex --force") [Yn] n
β”‚ ** (Mix) Could not find an SCM for dependency :nimble_parsec from Makeup.Mixfile
└────

It’s evident from the IEx session below that nimble_parsec is
available:

β”Œβ”€β”€β”€β”€
β”‚ $ iex 
β”‚ Interactive Elixir (1.14.0) - press Ctrl+C to exit (type h() ENTER for help)
β”‚ iex(1)> :code.which(NimbleParsec)
β”‚ '/gnu/store/261qi8bmagns11d3ssiypbqj82i9k16g-profile/lib/elixir/1.14/nimble_parsec/ebin/Elixir.NimbleParsec.beam'
└────

So, the pressing question is: how can we configure mix to prioritize ERL_LIBS over fetching new dependencies?

1 Like

This might help: mix-bootstrap.escript.

If nimble_parsec package is built locally:

/tmp/guix-build-elixir-nimble-parsec-1.3.1.drv-4$ tree -L 5
.
β”œβ”€β”€ _build
β”‚   └── prod
β”‚       └── lib
β”‚           └── nimble_parsec
β”‚               β”œβ”€β”€ consolidated
β”‚               └── ebin
β”œβ”€β”€ CHANGELOG.md
β”œβ”€β”€ CHECKSUM
β”œβ”€β”€ environment-variables
β”œβ”€β”€ lib
β”‚   β”œβ”€β”€ mix
β”‚   β”‚   └── tasks
β”‚   β”‚       └── nimble_parsec.compile.ex
β”‚   β”œβ”€β”€ nimble_parsec
β”‚   β”‚   β”œβ”€β”€ compiler.ex
β”‚   β”‚   └── recorder.ex
β”‚   └── nimble_parsec.ex
β”œβ”€β”€ metadata.config
β”œβ”€β”€ mix.exs
β”œβ”€β”€ README.md
└── VERSION

and a symlink has been built in the source of the package makeup that depends on nimble_parsec like so:

/tmp/guix-build-elixir-makeup-1.1.0.drv-6$ tree _build/
_build/
└── prod
    └── lib
        └── nimble_parsec -> /tmp/guix-build-elixir-nimble-parsec-1.3.1.drv-4/_build/prod/lib/nimble_parsec

then mix does not fetch dependencies:

/tmp/guix-build-elixir-makeup-1.1.0.drv-6$ guix shell elixir -- bash -c 'MIX_ENV=prod mix compile --no-deps-check'
Compiling 44 files (.ex)
Generated makeup app

It suffices to generalize that idea for all dependencies of a given package.