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

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

假设我搜索要安装的包,使用nix-env--query手术:

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

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

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

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

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

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

答案1

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

您应该能够轻松地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

答案2

您可以使用以下网站搜索软件包:


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

Python模块:

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

或者

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

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

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

或者你可以得到例如 npm 包:

nix-env -qaPA 'nixos.nodePackages'

答案3

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

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


请记住,nix-env 似乎忽略了下面的内容haskellPackages(也可能忽略其他内容)。您可以通过以下方式搜索子类别中的包,例如 haskellPackages nix-env -f '<nixpkgs>' -qaPA haskellPackages


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

答案4

nix-search () {
    local cache_file=~/.cache/nix/nix-env-qaP

    if [[ "$1" =~ ^--?c(ache)?$ ]]; then
        mkdir -p $(dirname $cache_file)
        echo -n "Caching packages.."
        nix-env -qaP '*' >$cache_file
        echo " 

相关内容