如何找到Nix软件包的名称以将其安装在configuration.nix中?


21

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

$ nix-env -qa 'aspell.*en'
aspell-dict-en-7.1-0

我将此包名称写在/etc/nixos/configuration.nixNixOS的主要配置文件中

environment.systemPackages = with pkgs; [
  aspell-dict-en
];

但是,如果我运行sudo nixos-rebuild switchNixOS命令来更新配置并安装声明式指定的所有系统范围的软件包,它将中止并显示错误:

error: undefined variable ‘aspell-dict-en’ at /etc/nixos/configuration.nix:44:5

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

Answers:


20

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

Nix上的每个包都由Nix表达式指定。Nix表达式是用Nix语言编写的一些文本,通常位于具有extension的文件中.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

您应该nix-env每天都习惯使用,因此请练习nix-env使用--query--install选项进行呼叫。但是,您也可以在Nix软件包搜索中浏览软件包并在线查找其属性路径。键入aspell,单击aspell-dict-en,您将看到软件包的各种属性,包括安装命令中的属性路径:

$ nix-env -iA nixos.pkgs.aspellDicts.en

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

environment.systemPackages = with pkgs; [
  aspellDicts.en
];

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


4
不幸的是,该-P选项无法使用--installed,可以看到使用nix-env -q --installed -P | grep terminus哪个打印terminus-font代替terminus_font。解决办法是使用nix-env -qaP | grep terminus-font,但是这意味着您不能轻易地将输出内容转储nix-env -q --installedconfiguration.nix
苏珊·杜彭(SuzanneDupéron)

4

如果您将NixOS用于数据科学:

Python模块:

nix-env -qaP .\*pylint.\*

要么

py_pkgs="nix_packages_py35.txt"
nix-env -qaP | grep -i python36 > ${py_pkgs}
grep pandas ${py_pkgs}

或者,如果您正在特别搜索R软件包/库

nix-env -f "<nixpkgs>" -qaP -A rPackages .\*tidyverse.\*

或者,您将获得具有以下内容的ig npm软件包:

nix-env -qaPA 'nixos.nodePackages'

还有一个搜索pkgs的网站


1
nix-env -v -qaP '*' | grep "nvim"

我会将结果保存nix-env -v -qaP '*'到文件中(因为通常需要一段时间才能返回)。


请记住,nix-env似乎忽略了haskellPackages(可能还有其他)下的东西。


nix-env搜索目前非常令人沮丧,因为它需要5秒钟以上的时间,然后返回一个error: regex error...


0

附加到Mirzhans选择:你可以检查/nix/store一样grep -irw "programm-name" /nix/store。但这可能有点令人困惑。同样在主目录中,您可以检查目录.local/share中已安装的programms / apps。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.