Come installare i pacchetti npm in NixOS?


10

In NixOS, ho installato il pacchetto yarncome al solito eseguendo $ nix-env -i yarn. Ora sto provando a correre yarnvia $ yarn start. Ma questo mi porta al seguente errore.

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

Quando provo ad installare webpack-dev-servernel mio solito modo NixOS ricevo un errore "match no derivations".

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

Ho letto che si webpack-dev-servertratta di un pacchetto npm e non sono sicuro di un paio di domande sulla pertinenza di questo in questo caso.

  1. Ha senso usare npm, un gestore di pacchetti diverso da nix, sotto Nix?
  2. Se la risposta a (1) è sì, come installare npm su NixOS? Non vedo npm disponibile durante la ricerca tramite nix-env, poiché $ nix-env -qa npmnon corrisponde a nessuna derivazione.

Qual è il modo corretto di installare webpack-dev-serversu NixOS?


MODIFICARE

Ho tentato di installare webpack-dev-serverseguendo il link commentato e sono stato in grado di installare node2nix, ma non sono in grado di seguire il passaggio 2 elencato nel file Leggimi lì.

Ho trovato il file a cui si fa riferimento nel passaggio 2 in /nix/storea

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

Posso aprire quel file per visualizzare i pacchetti npm elencati, ma le autorizzazioni sono di sola lettura, anche in esecuzione con sudo - quindi avrei bisogno di modificarne le autorizzazioni per modificarlo.

Sembra che non dovrei modificare questo /nix/storefile direttamente e dovrei invece manipolarlo indirettamente tramite nix. Ho ragione a non modificare direttamente questo file? In tal caso, in quale altro modo è possibile completare il passaggio 2 utilizzando nix o qualcosa da aggiungere webpack-dev-serverad esso?



@EmmanuelRosa grazie per il link; Ho provato a seguire le istruzioni lì e ho aggiornato questa domanda in base ai risultati di quel tentativo.
mherzl,

/nix/storeè di sola lettura. Devi clonare git repo e usarlo -I nixpkgs=/path/to/repoper il nix-*comando
wizzup

Risposte:


15

Esistono diversi modi per utilizzare i pacchetti npm tramite nix:

Per i miei progetti personali, utilizzo nix-shellquindi all'interno della shell utilizzo gli script npm per evitare la necessità di pacchetti globali npm (come con gulp). Il processo è simile a questo (ed è probabilmente molto simile per il filato):

$ 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

Questo funziona bene per me poiché nessuno dei miei pacchetti ha dipendenze binarie. Questo post descrive la creazione di default.nix per il tuo progetto, quindi non dovrai specificare dipendenze per ogni invocazione di nix-shell, ma è facoltativa.

Un altro modo è usare npm2nix:

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

Ciò farà sì che Nix gestisca tutti i pacchetti npm nel progetto.

Potrebbe essere una buona idea familiarizzare con nix-shell, poiché il tentativo di installare pacchetti di nodi / qualsiasi dipendenza nel proprio profilo nix (tramite nix-env o nox) vanifica lo scopo di nix inquinando lo spazio dei nomi "globale".


Potresti
approfondire

1
Ho scoperto come farlo per i pacchetti binari. Sono necessarie le nodePackages_6_x.node-gyplibrerie e qualsiasi altra libreria simile blas, quindi quando è tutto insieme, è possibile utilizzare i npm install ....pacchetti che utilizzano node-gyp.
CMCDragonkai,

1
Per quanto riguarda il primo metodo, in alternativa alla npm scriptssoluzione, trovo l'aggiunta di pacchetti npm globali nix-shellall'efficace, ad es nix-shell -p nodejs-8_x nodePackages.grunt-cli. (Attenzione: nixos e nodo noob qui.)
Ryne Everett,

L'unica cosa che non capisco del primo metodo è come installare effettivamente il pacchetto stesso, ovvero dove finisce il binario per il pacchetto del progetto. Json bin?
Ryne Everett,

@ ryne-everett Se corri npm install, gli eseguibili verrebbero collegati node_modules/.bin. Vedi qui .
Luke Adams,

8

Per qualche ragione non lo so, nodePackages non è nello spazio dei nomi di root e non può essere trovato usando nix-env -qa

utilizzare nix-env -qaPA 'nixos.nodePackages'per elencare i pacchetti disponibili.

$ 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

Se non ci sono pacchetti desiderati e non puoi crearne uno tuo, prova a richiederlo su NixOS github .


1
Sto usando solo il gestore di pacchetti nix ed è stato in grado di farlo funzionare con:nix-env -f '<nixpkgs>' -qaPA nodePackages | grep tern
zaynetro

La maggior parte di questi non si trova nello spazio dei nomi radice perché rallenterebbe la normale ricerca. È lo stesso con i pacchetti Haskell. Il loro spazio dei nomi è troppo grande.
user239558

3

In alternativa, ho anche trovato il commento di CMCDragonkai sul problema Nixpkgs # 3393 :

Ho appena scoperto che puoi cambiare la directory dei prefissi di NPM. Qualcosa di simile a:

npm config set prefix '~/mutable_node_modules.

Ciò consente di utilizzare l'installazione globale di NPM.

Quindi è possibile aggirare il modello puramente funzionale, reindirizzando i suoi output verso un posto che non è gestito da Nix. Ma immagino che sconfigge lo scopo di usare Nix. E non ogni singolo software supporterà questo tipo di modifiche alla configurazione.

Sento comunque che è molto difficile dover passare dall'uso nix-env per i normali pacchetti Node globali a quello npm per i pacchetti di sviluppo. Immagino sia per questo che ci sono tutti quei livelli di porting come "npm2nix".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.