Wie finde ich den Namen eines Nix-Pakets, um es in configuration.nix zu installieren?

21

Angenommen, ich suche nach einem Paket, das mithilfe nix-envder folgenden --queryOperation installiert werden soll :

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

Ich schreibe diese Paketnamen in /etc/nixos/configuration.nix, NixOS Hauptkonfigurationsdatei :

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

Wenn ich sudo nixos-rebuild switchjedoch den Befehl NixOS ausführe, um die Konfiguration zu aktualisieren und alle von deklarativ angegebenen systemweiten Pakete zu installieren , wird der Vorgang mit einem Fehler abgebrochen:

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

Ich weiß, dass für viele Pakete, obwohl nicht für alle, der Name, der nix-envzurückgegeben wird, und der Name, den man in der environment.systemPackagesKonfigurationsoption angeben sollte, unterschiedlich sind, aber ich verstehe die Logik nicht. Wie installiere ich ein Paket, das ich gefunden habe nix-env?

Mirzhan Irkegulov
quelle

Antworten:

20

In der NixOS-Community gibt es drei Handbücher. Wenn Sie nicht weiterkommen, konsultieren Sie diese immer zuerst:

Jedes Paket auf Nix wird durch einen Nix-Ausdruck angegeben. Ein Nix-Ausdruck ist ein Text in Nix-Sprache, der sich normalerweise in einer Datei mit der Erweiterung befindet .nix.

Jeder Ausdruck hat den sogenannten "symbolischen Namen", einen von Menschen lesbaren Namen, der gedruckt wird, wenn Sie ihn verwenden nix-env. Siehe Beispiel eines Nix-Ausdrucks . Nix selbst verwendet diesen symbolischen Namen intern nirgendwo. Es spielt also keine Rolle, ob Ihr Paket benannt ist aspell-dict-en, sondern nur für Ihre, menschliche, Bequemlichkeit.

Was tatsächlich zählt, ist der sogenannte „Attributpfad“. Ihre Verwechslung besteht also zwischen dem symbolischen Namen und dem Attributpfad. Jedes Paket verfügt über einen Attributpfad, den Sie in der environment.systemPackagesKonfigurationsoption verwenden können, um mithilfe der deklarativen Paketverwaltung systemweit zu installieren .

Fügen Sie -PIhrer Abfrage ein weiteres Flag hinzu, um den Attributpfad Ihres Pakets zu ermitteln:

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

Sie sollten sich nix-envin der täglichen Arbeit wohlfühlen. Üben Sie daher, nix-envmit --queryund --installOptionen zu telefonieren. Sie können Pakete jedoch auch durchsuchen und ihre Attributpfade online über die Nix-Paketsuche herausfinden . Geben Sie ein aspell, klicken Sie auf aspell-dict-enund Sie sehen verschiedene Eigenschaften des Pakets, einschließlich des Attributpfads als Teil des Installationsbefehls:

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

Jetzt können Sie diesen Attributpfad einfügen in /etc/nixos/configuration.nix:

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

Aktualisieren Sie dann das System, indem Sie ausführen sudo nixos-rebuild switch.

Mirzhan Irkegulov
quelle
4
Leider -Pfunktioniert die Option nicht mit --installed, wie zu sehen ist, mit nix-env -q --installed -P | grep terminuswelchen Ausdrucken terminus-fontstatt terminus_font. Die Problemumgehung ist die Verwendung nix-env -qaP | grep terminus-font, aber es bedeutet , dass Sie nicht einfach die Ausgabe des Dump kann nix-env -q --installedin die configuration.nix.
Suzanne Dupéron
4

Wenn Sie NixOS for Data Science verwenden:

Python- Module:

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

oder

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

ODER wenn Sie speziell nach R- Paketen / Bibliotheken suchen

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

alternativ bekommst du ig npm pakete mit:

nix-env -qaPA 'nixos.nodePackages'

es gibt auch eine website für die suche nach pkgs

Vor dem Gesetz
quelle
1
nix-env -v -qaP '*' | grep "nvim"

Ich würde das Ergebnis von nix-env -v -qaP '*'in einer Datei speichern (wie es normalerweise eine Weile dauert, um zurückzukehren).


Denken Sie daran, dass nix-env Dinge unter haskellPackages(und möglicherweise auch andere) zu ignorieren scheint .


nix-env search ist momentan ziemlich frustrierend, da es mehr als 5 Sekunden dauern wird und dann mit einem error: regex error...

Chris Stryczynski
quelle
0

Zusätzlich zu Mirzhans Optionen: Sie könnten /nix/storegerne überprüfen grep -irw "programm-name" /nix/store. Dies könnte jedoch etwas verwirrend sein. Auch in Ihrem Home-Verzeichnis können Sie das Verzeichnis .local/sharenach installierten Programmen / Apps durchsuchen.

saggzz
quelle