如何在 configuration.nix 中找到 Nix 包的名稱以將其安裝?
nix-env
假設我使用’操作搜尋要安裝的包--query
:$ nix-env -qa 'aspell.*en' aspell-dict-en-7.1-0
我將這個包名寫在
/etc/nixos/configuration.nix
NixOS 的主配置文件中: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
?
NixOS 社區有三本手冊,如果您遇到困難,請務必先查閱它們:
- Nix 手冊,用於包管理器
- NixOS 手冊,適用於作業系統
- Nixpkgs 手冊,用於 Nix 包基礎架構
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
。