Bagaimana menemukan nama paket Nix untuk menginstalnya di configuration.nix?

21

Misalkan saya mencari paket untuk menginstal menggunakan nix-env's --queryoperasi:

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

Saya menulis nama paket ini di /etc/nixos/configuration.nix, file konfigurasi utama NixOS :

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

Namun jika saya menjalankan sudo nixos-rebuild switch, perintah NixOS untuk memperbarui konfigurasi dan menginstal semua paket seluruh sistem yang ditentukan oleh deklaratif , itu dibatalkan dengan kesalahan:

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

Saya tahu bahwa untuk banyak paket, walaupun tidak semua, nama yang nix-envkembali dan nama yang harus ditentukan dalam environment.systemPackagesopsi konfigurasi berbeda, tetapi saya tidak mengerti logikanya. Bagaimana cara saya menginstal paket yang saya temukan nix-env?

Mirzhan Irkegulov
sumber

Jawaban:

20

Komunitas NixOS memiliki tiga manual, selalu konsultasikan terlebih dahulu, jika Anda mandek:

Setiap paket pada Nix ditentukan oleh ekspresi Nix. Ekspresi Nix adalah beberapa teks, yang ditulis dalam bahasa Nix, biasanya berada dalam file dengan ekstensi .nix.

Setiap ungkapan memiliki apa yang disebut "nama simbolik", nama yang dapat dibaca manusia yang dicetak, saat Anda gunakan nix-env. Lihat contoh ekspresi Nix . Nix sendiri tidak menggunakan nama simbolis ini di mana pun secara internal, jadi tidak masalah jika paket Anda dinamai aspell-dict-en, itu hanya untuk kenyamanan Anda, manusia.

Yang sebenarnya penting adalah apa yang disebut "jalur atribut". Jadi kebingungan Anda adalah antara nama simbolik dan jalur atribut. Setiap paket memiliki jalur atribut, yang dapat Anda gunakan dalam environment.systemPackagesopsi konfigurasi untuk menginstal seluruh sistem menggunakan manajemen paket deklaratif .

Untuk mengetahui jalur atribut paket Anda, tambahkan bendera lain -Pke kueri Anda:

$ nix-env -qaP 'aspell.*en'
nixos.aspellDicts.en  aspell-dict-en-7.1-0

Anda harus nyaman menggunakan nix-envsetiap hari, jadi berlatihlah nix-envdengan --querydan --installopsi. Namun Anda juga dapat menelusuri paket dan mengetahui jalur atributnya secara daring pada pencarian paket Nix . Ketik aspell, klik aspell-dict-endan Anda akan melihat berbagai properti paket, termasuk path atribut sebagai bagian dari perintah install:

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

Sekarang Anda dapat menempatkan path atribut ini ke /etc/nixos/configuration.nix:

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

Kemudian perbarui sistem dengan menjalankan sudo nixos-rebuild switch.

Mirzhan Irkegulov
sumber
4
Sayangnya, -Ppilihan tidak bekerja dengan --installed, seperti dapat dilihat dengan nix-env -q --installed -P | grep terminusyang mencetak terminus-fontbukan terminus_font. Solusinya adalah menggunakan nix-env -qaP | grep terminus-font, tetapi itu berarti bahwa Anda tidak dapat dengan mudah membuang output nix-env -q --installedke dalam configuration.nix.
Suzanne Dupéron
4

Jika Anda menggunakan NixOS untuk Ilmu Data:

Modul python :

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

atau

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

ATAU jika Anda mencari terutama paket R / perpustakaan

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

atau Anda mendapatkan paket ig npm dengan:

nix-env -qaPA 'nixos.nodePackages'

ada juga situs web untuk mencari pkg

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

Saya akan menyimpan hasil nix-env -v -qaP '*'ke file (karena biasanya butuh waktu untuk kembali).


Ingatlah, nix-env tampaknya mengabaikan hal-hal di bawah haskellPackages(dan mungkin yang lain).


pencarian nix-env saat ini cukup membuat frustasi karena akan membutuhkan 5+ detik dan kemudian kembali dengan error: regex error...

Chris Stryczynski
sumber
0

Tambahan untuk opsi Mirzhans: Anda bisa mengecek /nix/storesuka grep -irw "programm-name" /nix/store. Tapi ini bisa sedikit membingungkan. Juga di direktori home Anda, Anda dapat memeriksa direktori .local/shareuntuk program / aplikasi yang diinstal.

kendor
sumber