Comment installer les packages npm dans NixOS?

10

Dans NixOS, j'ai installé le package yarncomme d'habitude en exécutant $ nix-env -i yarn. Maintenant, j'essaie de courir yarnvia $ yarn start. Mais cela m'amène à l'erreur suivante.

$ yarn start
    yarn start v0.20.3
    $ webpack-dev-server --env dev 
    sh: webpack-dev-server: command not found
    error Command failed with exit code 127.

Lorsque j'essaie d'installer webpack-dev-serverde la manière habituelle NixOS, j'obtiens une erreur «ne correspond à aucune dérivation».

$ nix-env -i webpack-dev-server
error: selector ‘webpack-dev-server’ matches no derivations

J'ai lu qu'il webpack-dev-servers'agit d'un package npm, et je ne suis pas sûr de quelques questions concernant la pertinence de cela dans ce cas.

  1. Est-il judicieux d'utiliser npm, un gestionnaire de packages différent de nix, sous Nix?
  2. Si la réponse à (1) est oui, alors comment installer npm sur NixOS? Je ne vois pas de npm disponible lors de la recherche via nix-env, car $ nix-env -qa npmne correspond également à aucune dérivation.

Quelle est la bonne façon d'installer webpack-dev-serversur NixOS?


ÉDITER

J'ai essayé d'installer en webpack-dev-serversuivant le lien commenté et j'ai pu installer node2nix, mais je ne suis pas en mesure de suivre l'étape 2 répertoriée dans le fichier Lisez-moi.

J'ai localisé le fichier référencé à l'étape 2 dans /nix/storeà

/nix/store/sgk7sxgqxrv2axkxjwc3y15apcqbrv1z-nixos-17.03.1482.1b57bf274a/nixos/pkgs/development/node-packages/node-packages.json

Je peux ouvrir ce fichier pour afficher les packages npm répertoriés, mais les autorisations sont en lecture seule, même en cours d'exécution avec sudo - j'ai donc besoin de modifier ses autorisations afin de le modifier.

Il semble que je ne devrais pas éditer ce /nix/storefichier directement et plutôt le manipuler indirectement via nix. Ai-je raison de ne pas modifier directement ce fichier? Si oui, comment puis-je terminer l'étape 2 en utilisant nix ou quelque chose pour y ajouter webpack-dev-server?

mherzl
la source
@EmmanuelRosa merci pour le lien; J'ai tenté de suivre les instructions et mis à jour cette question en fonction des résultats de cette tentative.
mherzl
/nix/storeest en lecture seule. Vous devez cloner git repo et utiliser -I nixpkgs=/path/to/repopour la nix-*commande
wizzup

Réponses:

15

Il existe plusieurs façons d'utiliser les packages npm via nix:

Pour mes projets personnels, j'utilise nix-shellensuite dans le shell j'utilise des scripts npm pour éviter d'avoir besoin de packages globaux npm (comme avec gulp). Le processus ressemble à ceci (et est probablement très similaire pour le fil):

$ nix-shell -p nodejs-8_x
[nix-shell:yourproject]$ npm install # installs npm deps to project-local node_modules
[nix-shell:yourproject]$ npm exec (...) # using scripts configured in package.json

Cela fonctionne bien pour moi car aucun de mes packages n'a de dépendances binaires. Cet article décrit la création d'un default.nix pour votre projet, vous n'aurez donc pas à spécifier de dépendances pour chaque invocation de nix-shell, mais c'est facultatif.

Une autre façon utilise npm2nix:

node2nix -i node-packages.json # creates ./default.nix
nix-shell # nix-shell will look for a default.nix, which above will have generated

Ce qui amènera Nix à gérer tous les packages npm du projet.

Ce peut être une bonne idée de se familiariser avec nix-shell, car essayer d'installer des packages de nœuds / toute dépendance dans votre profil nix (via nix-env ou nox) va à l'encontre de l'objectif de nix en polluant l'espace de noms "global".

Luke Adams
la source
Pourriez-vous développer cela en ce qui concerne les packages utilisant binding.gyp par exemple: github.com/mateogianolio/nblas
CMCDragonkai
1
J'ai découvert comment le faire pour les packages binaires. Vous avez besoin de la nodePackages_6_x.node-gyp, et de toutes les autres bibliothèques comme blas, alors quand tout est ensemble, vous pouvez utiliser des npm install ....packages qui utilisent node-gyp.
CMCDragonkai
1
En ce qui concerne la première méthode, comme alternative à la npm scriptssolution, je trouve que l’ajout de packages globaux npm à l’ nix-shelleffectif, par exemple nix-shell -p nodejs-8_x nodePackages.grunt-cli. (Avertissement: nixos et noeud noob ici.)
Ryne Everett
La seule chose que je ne comprends pas à propos de la première méthode est de savoir comment installer le package lui-même, c'est-à-dire où se trouve le binaire du package.json du projet bin?
Ryne Everett du
@ ryne-everett Si vous exécutez npm install, les exécutables seraient liés node_modules/.bin. Voyez ici .
Luke Adams
8

Pour une raison que je ne sais pas, nodePackages n'est pas dans l'espace de noms racine et ne peut pas être trouvé en utilisant nix-env -qa

utiliser nix-env -qaPA 'nixos.nodePackages'pour lister les paquets disponibles.

$ nix-env -qaPA 'nixos.nodePackages' | grep -i web
nixos.nodePackages.webdrvr                     node-webdrvr-2.43.0-1
nixos.nodePackages.webpack                     node-webpack-2.6.1

S'il n'y a pas de packages que vous souhaitez et que vous ne pouvez pas créer les vôtres, essayez de le demander sur NixOS github .

wizzup
la source
1
J'utilise juste le gestionnaire de paquets nix et j'ai pu le faire fonctionner avec:nix-env -f '<nixpkgs>' -qaPA nodePackages | grep tern
zaynetro
La plupart d'entre eux ne se trouvent pas dans l'espace de noms racine car cela ralentirait la recherche normale. C'est la même chose avec les packages Haskell. Leur espace de noms est trop grand.
user239558
3

Comme alternative, j'ai également trouvé le commentaire de CMCDragonkai sur le problème Nixpkgs # 3393 :

Je viens de découvrir que vous pouvez changer le répertoire des préfixes de NPM. Quelque chose comme:

npm config set prefix '~/mutable_node_modules.

Cela vous permet d'utiliser l'installation globale de NPM.

Il est donc possible de contourner le modèle purement fonctionnel, en redirigeant ses sorties vers un endroit non géré par Nix. Mais je suppose que cela va à l'encontre de l'utilisation de Nix. Et tous les logiciels ne prendront pas en charge ces types de modifications de configuration.

Pourtant, je pense qu'il est très maladroit de devoir basculer entre l'utilisation nix-env pour les packages Node globaux normaux et npm pour les packages de développement. Je suppose que c'est pourquoi il y a toutes ces couches de portage comme "npm2nix".

toraritte
la source