在非NixOS系统上安装Elixir或Erlang>19和'nix'的标准方法是什么?

insrf1ej  于 2022-12-08  发布在  Erlang
关注(0)|答案(3)|浏览(129)

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't even a ~/.config directory.
I found the following (probably) relevant resources, and I can't put the pieces together:

Where do I specify the beam.packages.erlang<rel>.elixir exactly?

Is this needed for this?
In the end I installed the latest Elixir with Erlang 21 as shown below, but I'm sure that this is not how it is supposed to be done.

$ # Cloned the `nixpkgs` repo from github and started the repl
$ # in the same the directory.
$
$ nix repl
Welcome to Nix version 2.0.4. Type :? for help.

nix-repl> :l .   # if in the cloned `nixpkgs` repo
Added 9182 variables.

nix-repl> pkgs.beam.packages.erlangR21.elixir
«derivation /nix/store/vcadn6d6wgk1yjlci458vy8jqv66wwdy-elixir-1.6.5.drv»

nix-repl> :q

$ nix-store --realise /nix/store/vcadn6d6wgk1yjlci458vy8jqv66wwdy-elixir-1.6.5.drv
fdbelqdn

fdbelqdn1#

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.

x7yiwoj4

x7yiwoj42#

您可以创建一个用于项目的专用shell,并避免为当前用户全局安装运行时。
Erlang/OTP 20上Elixir的最小nix shell示例:
default.nix文件的内容:

with import <nixpkgs> {};

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

然后在终端中,导航到保存default.nix的目录,并调用nix-shell。您应该进入一个有iexmix可用的shell。

nxagd54h

nxagd54h3#

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.

相关问题