Nixos

如何在 configuration.nix 中找到 Nix 包的名稱以將其安裝?

  • May 8, 2021

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

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

引用自:https://unix.stackexchange.com/questions/250263