在 non-NixOS 系统上使用 `nix` 安装 Elixir 或 Erlang > 19 的规范方法是什么?
What is the canonical way of installing Elixir or Erlang > 19 with `nix` on a non-NixOS system?
请像对 10-year-old 一样解释它,从 Nix 包管理器安装在 non-NixOS 机器上开始。例如,我在 Mac 上,甚至没有 ~/.config
目录。
我找到了以下(可能)相关的资源,但我无法将它们拼凑起来:
-
Elixir 1.5.1 with Erlang 20.0 on NixOS 18.03?
我在哪里准确指定 beam.packages.erlang<rel>.elixir
?
-
Nix Pills, Chapter 14. Override Design Pattern
需要这个吗?
最后我用 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 . # 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
你走在正确的轨道上;无需重新开始。
要从 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
for. Here's an example of shell.nix.
您可以创建一个专用的 shell 供您的项目使用,并避免安装运行时 globally/for 当前用户。
Elixir 在 Erlang/OTP 20 上的最小 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
。您应该放入 shell,其中有 iex
和 mix
可用。
很高兴我当时发布了这个问题,因为答案很棒,但从那时起我意识到安装解释器没有实际意义(特别是因为有时需要多个版本),所以只需使用 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 更详细。
请像对 10-year-old 一样解释它,从 Nix 包管理器安装在 non-NixOS 机器上开始。例如,我在 Mac 上,甚至没有 ~/.config
目录。
我找到了以下(可能)相关的资源,但我无法将它们拼凑起来:
Elixir 1.5.1 with Erlang 20.0 on NixOS 18.03?
我在哪里准确指定
beam.packages.erlang<rel>.elixir
?Nix Pills, Chapter 14. Override Design Pattern
需要这个吗?
最后我用 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 . # 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
你走在正确的轨道上;无需重新开始。
要从 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
for. Here's an example of shell.nix.
您可以创建一个专用的 shell 供您的项目使用,并避免安装运行时 globally/for 当前用户。
Elixir 在 Erlang/OTP 20 上的最小 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
。您应该放入 shell,其中有 iex
和 mix
可用。
很高兴我当时发布了这个问题,因为答案很棒,但从那时起我意识到安装解释器没有实际意义(特别是因为有时需要多个版本),所以只需使用 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 更详细。