¿Cómo instalar paquetes npm en NixOS?

10

En NixOS, instalé el paquete yarncomo de costumbre al ejecutarlo $ nix-env -i yarn. Ahora estoy intentando ejecutar yarnvía $ yarn start. Pero esto me lleva al siguiente error.

$ 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.

Cuando trato de instalar webpack-dev-serveren mi forma habitual de NixOS, aparece un error de "coincide sin derivaciones".

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

Leí que webpack-dev-serveres un paquete npm, y no estoy seguro de un par de preguntas sobre la relevancia de eso en este caso.

  1. ¿Tiene sentido usar npm, un administrador de paquetes diferente a nix, en Nix?
  2. Si la respuesta a (1) es sí, ¿cómo instalar npm en NixOS? No veo npm disponible al buscar a través de nix-env, ya que $ nix-env -qa npmtampoco coincide con derivaciones.

¿Cuál es la forma correcta de instalar webpack-dev-serveren NixOS?


EDITAR

Intenté instalar webpack-dev-serversiguiendo el enlace comentado y pude instalarlo node2nix, pero no puedo seguir el paso 2 que figura en el archivo Léame allí.

Localicé el archivo referenciado en el paso 2 en /nix/storepor lo

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

Puedo abrir ese archivo para ver los paquetes npm enumerados, pero los permisos son de solo lectura, incluso se ejecutan con sudo, por lo que necesitaría editar sus permisos para modificarlo.

Parece que no debería editar este /nix/storearchivo directamente y debería manipularlo indirectamente a través de nix. ¿Estoy en lo cierto de que no debería editar este archivo directamente? Si es así, ¿de qué otra manera puedo completar el paso 2 usando nix o algo para agregar webpack-dev-server?

mherzl
fuente
@ EmmanuelRosa gracias por el enlace; Intenté seguir las instrucciones allí y actualicé esta pregunta de acuerdo con los resultados de ese intento.
mherzl
/nix/storees de solo lectura. -I nixpkgs=/path/to/reponix-*
Debe

Respuestas:

15

Hay múltiples formas de usar paquetes npm a través de nix:

Para mis proyectos personales, utilizo nix-shellluego dentro del shell, uso scripts npm para evitar la necesidad de paquetes globales npm (como con gulp). El proceso se parece a esto (y probablemente sea muy similar para el hilo):

$ 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

Esto funciona bien para mí, ya que ninguno de mis paquetes tiene dependencias binarias. Esta publicación describe la creación de un default.nix para su proyecto, por lo que no tendrá que especificar dependencias para cada invocación de nix-shell, pero es opcional.

Otra forma es usar npm2nix:

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

Lo que hará que Nix administre todos los paquetes npm en el proyecto.

Puede ser una buena idea familiarizarse con nix-shell, ya que intentar instalar paquetes de nodo / cualquier dependencia en su perfil de nix (a través de nix-env o nox) anula el propósito de nix al contaminar el espacio de nombres "global".

Luke Adams
fuente
¿Podría ampliar esto con respecto a los paquetes que usan encuadernación.gyp por ejemplo: github.com/mateogianolio/nblas
CMCDragonkai
1
Descubrí cómo hacerlo para paquetes binarios. Necesita las nodePackages_6_x.node-gypbibliotecas, y cualquier otra, como blas, entonces, cuando está todo junto, puede usar npm install ....paquetes que usan node-gyp.
CMCDragonkai
1
Con respecto al primer método, como alternativa a la npm scriptssolución, encuentro agregar paquetes globales npm a los nix-shellefectivos, por ejemplo nix-shell -p nodejs-8_x nodePackages.grunt-cli. (Advertencia: nixos y novato de nodo aquí.)
Ryne Everett
Lo único que no entiendo sobre el primer método es cómo instalar realmente el paquete en sí, es decir, ¿dónde termina el binario del paquete package.json del proyecto bin?
Ryne Everett
@ ryne-everett Si ejecuta npm install, los ejecutables se vincularán a node_modules/.bin. Ver aquí .
Luke Adams
8

Por alguna razón no lo sé, nodePackages no está en el espacio de nombres raíz y no se puede encontrar usando nix-env -qa

use nix-env -qaPA 'nixos.nodePackages'para enumerar los paquetes 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

Si no hay paquetes que desea y no puede crear uno propio, intente solicitarlo en NixOS github .

wizzup
fuente
1
Estoy usando solo nix package manager y pude hacer que funcione con:nix-env -f '<nixpkgs>' -qaPA nodePackages | grep tern
zaynetro
La mayoría de estos no están en el espacio de nombres raíz porque haría que la búsqueda normal fuera lenta. Es lo mismo con los paquetes de Haskell. Su espacio de nombres es demasiado grande.
user239558
3

Como alternativa, también encontré el comentario de CMCDragonkai sobre el tema Nixpkgs # 3393 :

Me acabo de enterar de que puedes cambiar el directorio de prefijos de NPM. Algo como:

npm config set prefix '~/mutable_node_modules.

Esto le permite utilizar la instalación global de NPM.

Por lo tanto, es posible evitar el modelo puramente funcional, redirigiendo sus salidas a un lugar que no sea administrado por Nix. Pero supongo que frustra el propósito de usar Nix. Y no todos los softwares admitirán este tipo de cambios de configuración.

Aún así, siento que es muy torpe tener que cambiar entre usar nix-env para paquetes de Nodo globales normales y npm para paquetes de desarrollo. Supongo que es por eso que hay todas esas capas de portabilidad como "npm2nix".

toraritte
fuente