Hello friends,
I’m desperately trying to have a nix build for one my app. I think I’m on the right track but I have a git dependency on the way that just doesn’t seem to be fetchable.
Please note that this is my first actual Nix build, I’ve been running NixOS for a few months now and only been using Nix shells using flakes, but no actual build.
The dependency is a public one: GitHub - nicklayb/box_ex: My Elixir toolbox but the project I’m trying to build is currently private. I tried to follow a few blog posts/forum posts/documentation, but here’s how my flake looks at the moment
Relevant files
flake.nix
{
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs =
{
self,
nixpkgs,
flake-utils,
}:
flake-utils.lib.eachDefaultSystem (
system:
let
pkgs = nixpkgs.legacyPackages.${system};
erl = pkgs.beam.interpreters.erlang_27;
erlangPackages = pkgs.beam.packagesWith erl;
elixir = erlangPackages.elixir;
in
{
devShells.default = pkgs.mkShell {
buildInputs = with pkgs; [
elixir
erlang_26
direnv
inotify-tools
just
gphoto2
v4l-utils
jq
ffmpeg
];
shellHook = ''
eval "$(direnv hook bash)"
direnv allow
mix deps.get
'';
};
packages = let
version = "0.1.0";
src = ./.;
mixFodDeps = erlangPackages.fetchMixDeps {
inherit version src;
pname = "photo-boite-deps";
sha256 = "sha256-njEjczedx4mRDZrIzqXXtwr7OoDroOG7hcqzU4WXu6U=";
};
translatedPlatform = {
aarch64-darwin = "macos-arm64";
aarch64-linux = "linux-arm64";
armv7l-linux = "linux-armv7";
x86_64-darwin = "macos-x64";
x86_64-linux = "linux-x64";
}
.${system};
in rec {
default = erlangPackages.mixRelease {
inherit version src mixFodDeps;
pname = "photo-boite-web";
postBuild = ''
mix do deps.loadpaths --no-deps-check, phx.digest
'';
preInstall = ''
ln -s ${pkgs.tailwindcss}/bin/tailwindcss _build/tailwind-${translatedPlatform}
ln -s ${pkgs.esbuild}/bin/esbuild _build/esbuild-${translatedPlatform}
${elixir}/bin/mix assets.deploy
${elixir}/bin/mix phx.gen.release
'';
};
};
}
);
}
mix.exs
defmodule PhotoBoite.MixProject do
use Mix.Project
def project do
[
app: :photo_boite,
version: "0.1.0",
elixir: "~> 1.14",
elixirc_paths: elixirc_paths(Mix.env()),
start_permanent: Mix.env() == :prod,
aliases: aliases(),
deps: deps()
]
end
def application do
[
mod: {PhotoBoite.Application, []},
extra_applications: [:logger, :runtime_tools]
]
end
defp elixirc_paths(:test), do: ["lib", "test/support"]
defp elixirc_paths(:dev), do: ["lib", "test/support"]
defp elixirc_paths(_), do: ["lib"]
defp deps do
[
{:bandit, "~> 1.5"},
# here's my git dep
{:box, git: "https://github.com/nicklayb/box_ex.git", tag: "0.14.0"},
{:credo, "~> 1.7.11", runtime: false, only: ~w(dev test)a},
{:ecto_sql, "~> 3.10"},
{:esbuild, "~> 0.8", runtime: Mix.env() == :dev},
{:gettext, "~> 0.26"},
{:jason, "~> 1.2"},
{:postgrex, ">= 0.0.0"},
{:phoenix, "~> 1.7.19"},
{:phoenix_ecto, "~> 4.5"},
{:phoenix_live_view, "~> 1.0.4"},
{:tailwind, "~> 0.2", runtime: Mix.env() == :dev},
{:tz, "~> 0.28"},
{:qr_code, "~> 3.2.0"}
]
end
defp aliases do
[
setup: ["deps.get", "ecto.setup", "assets.setup", "assets.build"],
"ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"],
"ecto.reset": ["ecto.drop", "ecto.setup"],
test: ["ecto.create --quiet", "ecto.migrate --quiet", "test"],
"assets.setup": ["tailwind.install --if-missing", "esbuild.install --if-missing"],
"assets.build": ["tailwind photo_boite", "esbuild photo_boite"],
"assets.deploy": [
"tailwind photo_boite --minify",
"esbuild photo_boite --minify",
"phx.digest"
],
gettext: [
"gettext.extract",
"gettext.merge priv/gettext"
]
]
end
end
The error I’m getting is (only in nix build, works fine locally in a shell):
last 25 log lines:
> Generated bandit app
> ==> websock_adapter
> Compiling 4 files (.ex)
> Generated websock_adapter app
> ==> phoenix
> Compiling 71 files (.ex)
> Generated phoenix app
> ==> phoenix_live_view
> Compiling 39 files (.ex)
> Generated phoenix_live_view app
> ==> box
> Compiling 37 files (.ex)
> Generated box app
> ==> phoenix_ecto
> Compiling 7 files (.ex)
> Generated phoenix_ecto app
> Running phase: buildPhase
> Compiling 20 files (.ex)
> Generated photo_boite app
> Running phase: installPhase
> Unchecked dependencies for environment prod:
> * box (https://github.com/nicklayb/box_ex.git - 0.14.0)
> lock mismatch: the dependency is out of date. To fetch locked version run "mix deps.get"
> ** (Mix) Can't continue due to errors on dependencies
Where I am right now:
- I see mentions of
mix2nix(instead oferlangPackages.fetchMixDeps), I don’t fully understand the difference, butmix2nixexplicitly says-
Currently, only public packages from Hex.pm are supported. If you have any dependencies from git, private repositories, or local sources, you will need to manually specify those.
- I tried to see how to add it manually, but box_ex has its own dependency, do I need to generate a
deps.nixon the git dependency too?
-
- I saw people saying that there might be build artifact in the nix env so making sure that _build as well deps is gitignore, that’s the case.
- I noticed that the deps SHA has influence, I had tried to update all my deps and they all had the
lock mismatcherror, once I updated the SHA, I went back to having only box_ex causing error.
I’m a little lost right now, I love the principle of Nix but the documentation isn’t quite optimal, neither is the tooling.
Any help would be appreciated. Thank you all!






















