Come si impedisce l'installazione dei moduli NPM "devDependencies" per Node.js (package.json)?


588

Ho questo nel mio file package.json (versione abbreviata):

{
  "name": "a-module",
  "version": "0.0.1",
  "dependencies": {
    "coffee-script":      ">= 1.1.3"
  },
  "devDependencies": {
    "stylus":             ">= 0.17.0"
  }
}

Sto usando NPM versione 1.1.1 su Mac 10.6.8.

Quando eseguo il seguente comando dalla radice del progetto, installa sia la dependencies e devDependencies :

npm install

Ho avuto l'impressione che questo comando abbia installato devDependencies:

npm install --dev

Come faccio a npm installinstallarlo solo in questo modo dependencies(quindi l'ambiente di produzione ottiene solo quei moduli), mentre qualcosa di simile npm install --devinstalla entrambi dependenciese devDependencies?


1
Secondo il documento, hai ragione, il --dev installa i devdeps, altrimenti solo i deps. npmjs.org/doc/json.html . So che questo funziona almeno per i pacchetti denominati.
mna,

1
se ti imbatti in questa domanda nel 2015, l'opzione -save-dev fa il trucco esattamente come chiesto in questa domanda.
Anand,

1
Questa risposta stackoverflow.com/a/22004559/3718119 fornisce una bella spiegazione delle differenze tra dependenciese devDependenciese quando vengono utilizzate.
Quasoft,

Risposte:


844

Il npm installcomando installerà l' devDependenciesaltro insieme dependenciesquando eseguito all'interno di una directory del pacchetto, in un ambiente di sviluppo (impostazione predefinita).

Utilizzare npm install --only=prod(o --only=production) solo per l'installazione dependenciese non devDependencies,indipendentemente dal valore della NODE_ENVvariabile di ambiente.

Fonte: npm docs

Nota: prima della v3.3.0 di npm (13-08-2015), veniva chiamata l'opzione --production, ad es npm install --production.


2
Il ragionamento dell'agata è probabilmente quello di rimuovere devDependencies in modo che i consumatori che installano il pacchetto npm install yourpackage.tgznon ottengano anche devDependencies. Tuttavia, questo è già il caso. Vedi la risposta di Kevin Cox di seguito ( stackoverflow.com/a/15826602/825588 ).
Johann,

5
npmjs.org/doc/cli/npm-install.html "Per impostazione predefinita, npm install installa tutti i moduli elencati come dipendenze. Con il flag --production, npm non installa i moduli elencati in devDependencies."
tomByrer,

14
Dio mio. Avevo totalmente NODE_ENV=productionda qualcos'altro che stavo facendo e non riuscivo a capire per la mia vita perché npm installnon avrei installato dipendenze. Grazie per la risposta esaustiva.
aendrew

1
npm install --dev installerebbe solo dipendenze di sviluppo
Rustem K

10
Per npm 3.3 e successivi: npm WARN install L'utilizzo --devdell'opzione è obsoleto. Usa --only=devinvece.
srcspider,

232

Ho riscontrato anche questo problema! npm install è alquanto confuso e i post sul web continuano a portare i flag -d / - dev come se ci fosse una modalità di installazione esplicita di "sviluppo".

  • npm installinstallerà sia " dipendenze " che " devDependencies "

  • npm install --productioninstallerà solo " dipendenze "

  • npm install --devinstallerà solo " devDependencies "


29
ATTENZIONE: Se NODE_ENVè impostato su productioned è in esecuzione npm install, non installerà dipendenze di sviluppo. Ho riscontrato questo problema nel mio Dockerfile.
vaughan,

1
@vaughan Ci sono anche io, posso essere risolto eseguendo npm --production=false install(anche se non sono sicuro che funzionerà a fianco della bandiera --dev)
Bavell

138

La nuova opzione è:

npm install --only=prod

Se si desidera installare solo devDependencies:

npm install --only=dev

1
Questo risponde al contrario della domanda. OP sta chiedendo come NON installare devDependencies.
musicin3d

2
hai in parte corretto @ musicin3d, ecco perché nella prima parte ho risposto a come installare solo dipendenze prod e nella seconda parte come installare dipendenze solo dev, per ogni evenienza.
Cloxure,

5
Ehilà. Ho lasciato quel commento prima che @ user1614572 aggiungesse la parte --only=prod. Lei, signore, è parzialmente corretto. ; P
musicin3d

possiamo includere una dipendenza separata per la distribuzione?
Jeeva Jsb

1
È un commento, non una risposta. Non vado a controllare periodicamente tutti i miei commenti. Non ho mai visto persone aggiornare i commenti di anni fa. Fondamentalmente sei venuto qui per criticare che ho messo un anno al mio commento. Non risponderò ulteriormente. Divertiti a trollare altre persone.
Jacques ジ ャ ッ ク

47

Se leggi questo POST nel 2016, ti preghiamo di ottenere ciò che desideri utilizzando

--only={prod[uction]|dev[elopment]} 

L'argomento causerà l'installazione solo di devDependencies o solo di non devDependencies indipendentemente da NODE_ENV.

da: https://docs.npmjs.com/cli/install


Perché capitalizzare "POST"? docs.npmjs.com/cli/install documenta chiaramente ENTRAMBI --productione --only={prod[uction]|dev[elopment]}.
Dan Dascalescu,

33

Se hai già installato tutte le tue dipendenze e vuoi evitare di dover scaricare nuovamente i tuoi pacchetti di produzione da NPM, puoi semplicemente digitare:

npm prune --production

Questo rimuoverà le tue dipendenze di sviluppo dalla tua node_modulescartella, il che è utile se stai cercando di automatizzare un processo in due passaggi come

  1. Webpack il mio progetto, usando le dipendenze degli sviluppatori
  2. Crea un'immagine Docker usando solo i moduli di produzione

Correre npm prunein mezzo ti eviterà di dover reinstallare tutto!


19

Quando si utilizza "npm install", i moduli vengono caricati e disponibili in tutta l'applicazione indipendentemente dal fatto che siano "devDependencies" o "dipendences". Somma di questa idea: tutto ciò che package.json definisce come una dipendenza (qualsiasi tipo) viene installato su node_modules.

Lo scopo della differenza tra dipendenze / devDependencies / optionalDependencies è ciò che gli utenti del codice possono fare con l'installazione di queste risorse.

Per la documentazione: https://npmjs.org/doc/json.html ...

Se qualcuno sta pianificando di scaricare e utilizzare il modulo nel proprio programma, probabilmente non desidera o non è necessario scaricare e creare il test esterno o il framework di documentazione che si utilizza.

In questo caso, è meglio elencare questi elementi aggiuntivi in ​​un hash devDependencies.

Queste cose verranno installate ogni volta che viene impostato il flag di configurazione --dev. Questo flag viene impostato automaticamente quando si esegue il collegamento npm o quando si esegue l'installazione di npm dalla radice di un pacchetto e può essere gestito come qualsiasi altro parametro di configurazione di npm. Vedi config (1) per ulteriori informazioni sull'argomento.

Tuttavia, per risolvere questa domanda, se si desidera installare SOLO le "dipendenze" utilizzando npm, il comando seguente è:

npm install --production

Ciò può essere confermato guardando il commit Git che ha aggiunto questo filtro (insieme ad altri filtri [elencati di seguito] per fornire questa funzionalità).

Filtri alternativi che possono essere utilizzati da npm:

--save          => updates dependencies entries in the {{{json}}} file
--force         => force fetching remote entries if they exist on disk 
--force-latest  => force latest version on conflict
--production    => do NOT install project devDependencies
--no-color      => do not print colors

@dmarr prova a usare npm install --production


16

npm installerà le dipendenze degli sviluppatori durante l'installazione dall'interno di un pacchetto (se presente package.jsonnella directory corrente). Se proviene da un'altra posizione (registro npm, repository git, posizione diversa sul filesystem) installa solo le dipendenze.


Potresti riformulare, per favore? Penso che tu abbia fatto un errore nella tua parentesi, penso che ti sia dimenticato di chiuderlo prima e la tua frase non ha molto senso per me (non madrelingua inglese). Il commento di Johann sotto la risposta di Rohan Singh mi ha indicato di guardare alla tua risposta (perché il mio dubbio era esattamente lo stesso del dubbio dell'agata), e nessun successo. Ancora non capisco come npm install some-modulenon installerà dipendenze di sviluppo di some-module.
Rafael Eyng,

Grazie, risolto. Tuttavia, non capisco il resto della tua domanda.
Kevin Cox,

3

Ho scoperto che, quando si tenta di installare le dipendenze dev per un pacchetto che contiene un componente aggiuntivo del nodo, non è possibile evitare di creare il componente aggiuntivo quando si esegue npm install --dev anche se si desidera solo installare devDependencies. Quindi, ho dovuto andare in giro per npm:

node -e 'console.log( Object.keys( require( "./package.json" ).devDependencies ) );' | \
sed  -e "s/^[^']*'//" -e "s/'.*$//" | \
xargs npm install

O, meglio (e più succintamente) ancora,

node -e 'Object.keys( require( "./package.json" ).devDependencies )
.map( function( item ){ console.log( item ) } );' | xargs npm install

3

Usa npm install packageName --savequesto aggiungerà il pacchetto in dipendenze , se lo usi npm install packageName --save-devallora devDependencies .

npm install packageName --save-devdovrebbe essere usato per aggiungere pacchetti a scopo di sviluppo. Come aggiungere pacchetti TDD (Chai, mocha, ecc.). Quali sono utilizzati nello sviluppo e non nella produzione.


L'OP non sta riscontrando problemi durante il salvataggio delle dipendenze, package.jsonma una volta che queste dipendenze sono già state salvate , quindi come forzare npml'installazione di un solo tipo specifico di dipendenza. Quando ho letto la tua risposta qui, non ho imparato nulla che mi aiuti a risolvere il problema posto dall'OP.
Louis,

3

Vale la pena ricordare che è possibile utilizzare la NODE_ENVvariabile di ambiente per ottenere lo stesso risultato. Particolarmente utile se si containerizza l'applicazione Node (ad es. Docker).

NODE_ENV=production npm install

Il codice sopra installerà tutte le tue dipendenze tranne quelle di sviluppo (es devDependencies.).

se è necessario utilizzare le variabili di ambiente per Dockerfileulteriori informazioni, è possibile trovare qui .

Le variabili di ambiente sono facili da sovrascrivere quando necessario (ad es. Se si desidera eseguire la suite di test, dire su Travis CI). Se così fosse, potresti fare qualcosa del genere:

docker run -v $(pwd):/usr/src/app --rm -it -e NODE_ENV=production node:8 npm install

Documentazione NPM qui

produzione

  • Predefinito: falso
  • Tipo: Booleano Impostato su true per l'esecuzione in modalità "produzione".

    1. devDependencies non viene installato al livello più alto quando si esegue l'installazione di npm locale senza argomenti.
    2. Impostare NODE_ENV = "produzione" per gli script del ciclo di vita.

Felice containerizzazione =)


3

Suggerisco di usare npm ci. Se vuoi installare solo i pacchetti necessari per la produzione (come hai scritto - senza devDependencies), allora:

npm ci --only=production

o

NODE_ENV=production npm ci

Se preferisci la vecchia scuola npm installallora:

npm install --production

o

NODE_ENV=production npm install

Ecco una buona risposta sul motivo per cui dovresti usare npm ci.


npm ciBene, funziona anche con , non solo npm install!
Klesun

2

È necessario aggiungere la risposta scelta: a partire da ora, npm installin una directory del pacchetto (contenente package.json) verranno installati devDependencies, mentre npm install -gnon li installerà.


7
Sì, -gnon verrà installato devDependencies, ma installa i pacchetti a livello globale, che spesso non è il risultato previsto.
Bardi Harbor,

0

npm install --productionè il modo giusto di installare i moduli nodo necessari per la produzione. Controlla la documentazione per maggiori dettagli


-1

Ora c'è un problema, se hai package-lock.json con npm 5+. Devi rimuoverlo prima dell'uso di npm install --production.


-1
npm install --dev will install dev dependencies

E, secondo la domanda per installare solo dipendenze, il seguente comando aiuterà

npm install --prod will install dependencies
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.