如何找到 Nix 包的名称以在 configuration.nix 中安装它?

Mir*_*lov 28 nixos nix

假设我使用nix-env--query操作搜索要安装的软件包:

$ nix-env -qa 'aspell.*en'
aspell-dict-en-7.1-0
Run Code Online (Sandbox Code Playgroud)

我在/etc/nixos/configuration.nixNixOS 的主配置文件中写了这个包名:

environment.systemPackages = with pkgs; [
  aspell-dict-en
];
Run Code Online (Sandbox Code Playgroud)

然而,如果我运行sudo nixos-rebuild switch, NixOS 命令来更新配置并安装declaratively指定的所有系统范围的软件包,它会因错误而中止:

error: undefined variable ‘aspell-dict-en’ at /etc/nixos/configuration.nix:44:5
Run Code Online (Sandbox Code Playgroud)

我知道对于很多包,虽然不是全部,nix-env返回的名称和应该在environment.systemPackages配置选项中指定的名称是不同的,但我不明白其中的逻辑。如何安装通过 找到的软件包nix-env

Mir*_*lov 25

NixOS 社区有三本手册,如果您遇到困难,请务必先查阅它们:

Nix 上的每个包都由 Nix 表达式指定。Nix 表达式是一些用 Nix 语言编写的文本,通常驻留在扩展名为.nix.

每个表达式都有所谓的“符号名称”,当您使用nix-env. 请参阅示例 Nix 表达式。Nix 本身不会在内部的任何地方使用这个符号名称,所以你的包是否命名并不重要aspell-dict-en,它只是为了你的,人类的,方便。

真正重要的是所谓的“属性路径”。所以你的混淆是在符号名称和属性路径之间。每个包都有一个属性路径,您可以在environment.systemPackages配置选项中使用它来使用声明性包管理在系统范围内安装。

要找出包的属性路径,-P请在查询中添加另一个标志:

$ nix-env -qaP 'aspell.*en'
nixos.aspellDicts.en  aspell-dict-en-7.1-0
Run Code Online (Sandbox Code Playgroud)

您应该可以轻松地nix-env每天使用,因此请练习nix-env使用--query--install选项呼叫。但是,您也可以在Nix 包搜索上浏览包并在线查找它们的属性路径。键入aspell,单击aspell-dict-en,您将看到各种包的属性,包括作为安装命令一部分的属性路径:

$ nix-env -iA nixos.pkgs.aspellDicts.en
Run Code Online (Sandbox Code Playgroud)

现在您可以将此属性路径放入/etc/nixos/configuration.nix

environment.systemPackages = with pkgs; [
  aspellDicts.en
];
Run Code Online (Sandbox Code Playgroud)

然后通过运行更新系统sudo nixos-rebuild switch

  • 不幸的是,`-P` 选项不适用于`--installed`,如`nix-env -q --installed -P | 所示。grep terminus` 打印 `terminus-font` 而不是 `terminus_font`。解决方法是使用`nix-env -qaP | grep terminus-font`,但这意味着你不能轻易地将 `nix-env -q --installed` 的输出转储到 `configuration.nix` 中。 (6认同)

InL*_*Law 5

如果您使用 NixOS 进行数据科学:

Python模块:

nix-env -qaP .\*pylint.\*
Run Code Online (Sandbox Code Playgroud)

或者

py_pkgs="nix_packages_py35.txt"
nix-env -qaP | grep -i python36 > ${py_pkgs}
grep pandas ${py_pkgs}
Run Code Online (Sandbox Code Playgroud)

或者,如果您正在寻找特别 R包/库

nix-env -f "<nixpkgs>" -qaP -A rPackages .\*tidyverse.\*
Run Code Online (Sandbox Code Playgroud)

或者你会得到例如 npm 包:

nix-env -qaPA 'nixos.nodePackages'
Run Code Online (Sandbox Code Playgroud)

还有一个网站可以搜索pkgs