What is the canonical way of installing Elixir or Erlang > 19 with `nix` on a non-NixOS system?

前端 未结 3 404
被撕碎了的回忆
被撕碎了的回忆 2021-01-01 02:40

Please explain it as you would to a 10-year-old, from the point after the Nix package manager is installed on a non-NixOS machine. For example, I am on a Mac, and there isn\

相关标签:
3条回答
  • 2021-01-01 03:34

    You are on the right track; there is no need to start over.

    To install the package from nix repl you can use the :i command.

    nix-repl> :i pkgs.beam.packages.erlangR21.elixir
    

    This will install the package into your ~/.nix-profile where it will be in $PATH, so you can call it. It is equivalent to running

    nix-env -iA nixpkgs.beam.packages.erlangR21.elixir
    

    nix-store -r (or equivalently, nix-store --realise) is considered a very low-level tool. It can only create a symlink to a package and that is rarely what you want. It doesn't even create a garbage collection root by default, so if you garbage collect, the symlink will become broken.

    Although nix-env -iA is a valid way of installing software, you may consider ~/.nix-profile global state and avoid it for that reason. It seems to me like elixir that is more tied to a project, rather than to your user. For example you may want to use distinct versions for some projects and it may make sense to share your development tools with others who work on a project. That is you can use nix-shell for. Here's an example of shell.nix.

    0 讨论(0)
  • 2021-01-01 03:46

    You can create a dedicated shell for use with your project, and avoid installing the runtime globally/for current user.

    Example of minimal nix shell for Elixir on Erlang/OTP 20:

    The contents of default.nix file:

    with import <nixpkgs> {};
    
    stdenv.mkDerivation rec {
        name = "env";
        env = buildEnv { name = name; paths = buildInputs; };
        buildInputs = [
            beam.packages.erlangR20.elixir
            inotify-tools
        ];
    }
    

    Then in terminal, navigate to the directory where default.nix is saved, and invoke nix-shell. You should drop into a shell which has iex and mix available.

    0 讨论(0)
  • 2021-01-01 03:46

    Glad I posted this question back then because the answers are terrific, but since then I realized that there is no real point in installing interpreters (especially because sometimes multiple versions are needed), so just use nix-shell on demand.

    For the current version in the active channel:

    nix-shell -p erlang
    

    For other versions not in the current channel, a specific channel can be given:

    nix-shell -I nixpkgs=channel:nixos-unstable -p erlangR22
    

    Or add path to the Nix expression in your NixOS/nixpkgs clone:

    $ nix-shell -I nixpkgs=~/clones/nixpkgs -p erlangR23
    

    How to find packages with attribute paths on the console

    $ nix-env -qaP 'erlang*'
    # ...
    nixos.erlangR20            erlang-20.3.8.9
    nixos.erlangR21            erlang-21.3.8.3
    nixos.erlang               erlang-22.1.7
    # ...
    
    $ nix-env -f ~/clones/nixpkgs/ -qaP 'erlang*'
    # ...
    nixos.erlangR20            erlang-20.3.8.9
    nixos.erlangR21            erlang-21.3.8.3
    nixos.erlang               erlang-22.1.7
    # ...
    === >>> erlangR23            erlang-23.0.2  <<<====
    

    This answer goes more into the details.

    0 讨论(0)
提交回复
热议问题