Nix function that reads mix.lock file and builds a Mix project.
Works inside the Nix sandbox.
To try it out, create the following default.nix in your Mix project:
with import <nixpkgs> {};
let
inherit (callPackage (fetchGit {
url = https://gitlab.com/transumption/mix-to-nix;
rev = "b70cb8f7fca80d0c5f7539dbfec497535e07d75c";
}) {}) mixToNix;
in
mixToNix { src = ./.; }Run nix-build.
To start an OTP app, run:
$ cd result
$ MIX_ENV=prod \
mix run -c /path/to/config.exs --no-deps-check --no-halt
To build an escript, override postBuild and installPhase:
(mixToNix { src = ./.; }).overrideAttrs (super: {
postBuild = ''
mix escript.build --no-deps-check
'';
installPhase = "install -Dt $out/bin ${super.pname}";
})(mixToNix { src = ./.; }).overrideAttrs (super: {
buildPhase = ''
mix do deps.loadpaths --no-deps-check, release --env=prod
'';
installPhase = ''
mkdir $out
find _build -name \*.tar.gz | xargs cat | tar zxf - -C $out
'';
})If src is a path, it is filtered against lib.cleanSource, _build/, and
deps/.
elixir-to-json evaluates Elixir term in mix.lock and
marshals it to JSON. Tuples are represented as lists.
Then, Nix imports that JSON via lib.importJSON. Each mix.lock key
corresponds to a deps/ path. Two types of deps are supported, :git and
:hexpm.
:git fetches given rev from HEAD. It doesn't support other branches just
yet, see NixOS/nix#2409.
:hexpm fetches package from Hex.pm. It comes with a SHA-256
hash of catenation of Mix archive version, package metadata, and .tar.gz
source code archive. Nix can only carry that catenation into the sandbox, so
binwalk finds where the source code
archive starts and extracts that part, ignoring archive version and metadata.
Mix, Rebar3 and ErlangMk deps are supported.
fake-hex-registry creates a fake Hex v1
registry with dependencies for Rebar3 projects. Rebar3
needs registry to function.
Every dependency is built and cached individually via Nixpkgs buildMix
and buildRebar3.
:git dependencies are flat, so they are assumed to depend on every non-Git
entry in mix.lock. If this is undesirable, or if you want to make Git deps
depend on each other, you can override beamDeps via overlay.
If you have dependencies that require Rebar3 plugins (such as pc or
rebar3_hex), add them to mix.exs deps. These are normally unpinned and
non-sandboxable. You will also need to set buildPlugins via overlay. See
tests/02-fast-yaml for example.