Comment trouver le nom d'un package Nix pour l'installer dans configuration.nix?

21

Supposons que je recherche un package à installer à l'aide nix-envde l' --queryopération de:

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

J'écris ce nom de package dans /etc/nixos/configuration.nix, le fichier de configuration principal de NixOS :

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

Pourtant, si sudo nixos-rebuild switchj'exécute, la commande NixOS pour mettre à jour la configuration et installer tous les packages à l'échelle du système spécifiés par déclarativement , elle abandonne avec une erreur:

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

Je sais que pour de nombreux packages, bien que pas tous, le nom qui nix-envrevient et le nom que l'on doit spécifier dans l' environment.systemPackagesoption de configuration sont différents, mais je ne comprends pas la logique. Comment installer un package que j'ai trouvé via nix-env?

Mirzhan Irkegulov
la source

Réponses:

20

La communauté NixOS a trois manuels, consultez-les toujours en premier, si vous êtes coincé:

Chaque package sur Nix est spécifié par une expression Nix. Une expression Nix est un texte écrit en langage Nix, résidant généralement dans un fichier avec une extension .nix.

Chaque expression a le soi-disant «nom symbolique», un nom lisible par l'homme qui est imprimé lorsque vous l'utilisez nix-env. Voir un exemple d'expression Nix . Nix lui-même n'utilise ce nom symbolique nulle part en interne, donc peu importe si votre package est nommé aspell-dict-en, c'est juste pour votre convenance humaine.

Ce qui importe réellement, c'est le soi-disant «chemin d'attribut». Votre confusion est donc entre le nom symbolique et le chemin d'attribut. Chaque package a un chemin d'attribut, que vous pouvez utiliser dans l' environment.systemPackagesoption de configuration pour installer à l'échelle du système à l'aide de la gestion déclarative des packages .

Pour connaître le chemin d'attribut de votre package, ajoutez un autre indicateur -Pà votre requête:

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

Vous devriez être à l'aise d'utiliser nix-envquotidiennement, alors exercez-vous à appeler nix-envavec --queryet les --installoptions. Cependant, vous pouvez également parcourir les packages et découvrir leurs chemins d'attributs en ligne sur la recherche de packages Nix . Tapez aspell, cliquez sur aspell-dict-enet vous verrez diverses propriétés du package, y compris le chemin d'attribut dans le cadre de la commande d'installation:

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

Vous pouvez maintenant placer ce chemin d'attribut dans /etc/nixos/configuration.nix:

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

Mettez ensuite à jour le système en exécutant sudo nixos-rebuild switch.

Mirzhan Irkegulov
la source
4
Malheureusement, l' -Poption ne fonctionne pas --installed, comme on peut le voir avec les nix-env -q --installed -P | grep terminusimpressions terminus-fontau lieu de terminus_font. La solution de contournement est d'utiliser nix-env -qaP | grep terminus-font, mais cela signifie que vous ne pouvez pas facilement vider la sortie de nix-env -q --installeddans le configuration.nix.
Suzanne Dupéron
4

Si vous utilisez NixOS pour la science des données:

Modules Python :

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

ou

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

OU si vous recherchez en particulier des packages / bibliothèques R

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

vous pouvez également obtenir des packages ig npm avec:

nix-env -qaPA 'nixos.nodePackages'

il y a aussi un site web pour rechercher des paquets

En loi
la source
1
nix-env -v -qaP '*' | grep "nvim"

Je voudrais enregistrer le résultat de nix-env -v -qaP '*'dans un fichier (car il faut généralement un certain temps pour revenir).


Gardez à l'esprit, nix-env semble ignorer les choses sous haskellPackages(et peut-être d'autres).


La recherche nix-env est actuellement assez frustrante car elle prendra plus de 5 secondes, puis reviendra avec un error: regex error...

Chris Stryczynski
la source
0

En plus des options de Mirzhans: vous pouvez vérifier /nix/storecomme grep -irw "programm-name" /nix/store. Mais cela pourrait être un peu déroutant. Toujours dans votre répertoire personnel, vous pouvez vérifier dans le répertoire les .local/shareprogrammes / applications installés.

saggzz
la source