phf
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?
Marked As Solved
phf
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.







