Elixir Flake

{
description = "An Elixir development shell.";

inputs.nixpkgs.url = "nixpkgs";

outputs =
{
self,
nixpkgs,
}:
let
overlay = prev: final: rec {
beamPackages = prev.beamMinimal28Packages;
elixir = beamPackages.elixir_1_19;
erlang = beamPackages.erlang;
elixir-ls = beamPackages.elixir-ls.override {
elixir = elixir;
# mixRelease = beamPackages.mixRelease.override { elixir = elixir; };
};
hex = beamPackages.hex;
final.mix2nix = prev.mix2nix.overrideAttrs {
nativeBuildInputs = [ final.elixir ];
buildInputs = [ final.erlang ];
};
};

  forAllSystems = nixpkgs.lib.genAttrs [
    "x86_64-linux"
    "aarch64-linux"
    "x86_64-darwin"
    "aarch64-darwin"
  ];

  nixpkgsFor =
    system:
    import nixpkgs {
      inherit system;
      overlays = [ overlay ];
    };
in
{
  devShells = forAllSystems (
    system:
    let
      pkgs = nixpkgsFor system;
    in
    {
      default =
        let
          opts =
            with pkgs;
            lib.optional stdenv.isLinux inotify-tools
            ++ lib.optionals stdenv.isDarwin (
              with darwin.apple_sdk.frameworks;
              [
                CoreServices
                Foundation
              ]
            );
        in
        pkgs.mkShell {
          packages =
            with pkgs;
            [
              elixir
              elixir-ls
              hex
              mix2nix
            ]
            ++ opts;
          shellHook = ''
            # Set up `mix` to save dependencies to the local directory
            mkdir -p .nix-mix
            mkdir -p .nix-hex
            export MIX_HOME=$PWD/.nix-mix
            export HEX_HOME=$PWD/.nix-hex
            export PATH=$MIX_HOME/bin:$PATH
            export PATH=$HEX_HOME/bin:$PATH

            # BEAM-specific
            export LANG=en_US.UTF-8
            export ERL_AFLAGS="-kernel shell_history enabled"
          '';
        };
    }
  );
};

}