在非NixOS系统上使用`nix`在Erlang> 19上安装Elixir的规范方法是什么?

时间:2018-07-16 22:47:56

标签: erlang elixir nix

从在非NixOS机器上安装Nix软件包管理器的那一刻起,请向10岁的孩子解释一下。例如,我在Mac上,甚至没有~/.config目录。

我找到了以下(可能)相关资源,但我无法将它们拼凑在一起:


最后,我安装了带有Erlang 21的最新Elixir,如下所示,但我确定这不是应该做的。

$ # 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 nixpkgs
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

3 个答案:

答案 0 :(得分:3)

您处在正确的轨道上;无需重新开始。

要从nix repl安装软件包,可以使用:i命令。

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

这会将软件包安装到~/.nix-profile中的$PATH中,因此您可以对其进行调用。等同于运行

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

nix-store -r(或等效为nix-store --realise)被认为是非常底层的工具。它只能创建到程序包的符号链接,而这几乎不是您想要的。默认情况下,它甚至不会创建垃圾回收根,因此,如果您进行垃圾回收,则符号链接将断开。

尽管nix-env -iA是安装软件的有效方法,但是您可以考虑使用~/.nix-profile全局状态,并避免这种状态。在我看来,elixir与项目而不是用户密切相关。例如,您可能想对某些项目使用不同的版本,并且与从事该项目的其他人共享您的开发工具可能很有意义。也就是说,您可以使用nix-shell。这是一个example of shell.nix.

答案 1 :(得分:3)

您可以创建一个专用的Shell来与您的项目一起使用,并避免全局安装/为当前用户安装运行时。

Erlang / OTP 20上Elixir的最小nix外壳示例:

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。

答案 2 :(得分:1)

很高兴我当时发布了这个问题,因为答案非常棒,但是从那时起,我意识到安装解释器没有真正意义(特别是因为有时需要多个版本),因此只需按需使用nix-shell

对于活动频道中的当前版本:

nix-shell -p erlang

对于不在当前频道中的其他版本,可以指定一个特定频道:

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

或在您的NixOS/nixpkgs克隆中添加Nix表达式的路径:

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

如何在控制台上查找具有属性路径的软件包

$ 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进入了更多细节。