Qual è la differenza tra "npm install" e "npm ci"?


215

Sto lavorando con integrazione continua e ho scoperto il comando npm ci .

Non riesco a capire quali siano i vantaggi dell'utilizzo di questo comando per il mio flusso di lavoro.

È più veloce? Rende il test più difficile, va bene e dopo?

Risposte:


328

Dai documenti di npm :

In breve, le principali differenze tra l'utilizzo di npm install e npm ci sono:

  • Il progetto deve avere un pacchetto-lock.json o npm-shrinkwrap.json esistente.
  • Se le dipendenze nel blocco del pacchetto non corrispondono a quelle in package.json, npm ci uscirà con un errore, invece di aggiornare il blocco del pacchetto.
  • npm ci può installare interi progetti alla volta: non è possibile aggiungere singole dipendenze con questo comando.
  • Se un node_modules è già presente, verrà automaticamente rimosso prima che npm ci inizi l'installazione.
  • Non scriverà mai su package.json o su uno dei pacchetti-lock: le installazioni sono essenzialmente bloccate.

In sostanza, npm installlegge package.jsonper creare un elenco di dipendenze e utilizza package-lock.jsonper informare quali versioni di queste dipendenze installare. Se una dipendenza non package-lock.jsonè presente verrà aggiunta danpm install .

npm ci(dal nome di C ontinuous I ntegrazione) installa le dipendenze direttamente da package-lock.jsone usi package.jsonsolo per verificare che non vi siano versioni non corrispondenti. Se mancano delle dipendenze o hanno versioni incompatibili, verrà generato un errore .

Utilizzare npm installper aggiungere nuove dipendenze e per aggiornare le dipendenze su un progetto. Di solito, lo useresti durante lo sviluppo dopo aver inserito le modifiche che aggiornano l'elenco delle dipendenze, ma potrebbe essere una buona idea usare npm ciin questo caso.

Utilizzare npm cise è necessaria una build deterministica e ripetibile. Ad esempio durante l'integrazione continua, i lavori automatizzati, ecc. E quando si installano le dipendenze per la prima volta, anziché npm install.

npm install

  • Installa un pacchetto e tutte le sue dipendenze.
  • Le dipendenze sono guidate da npm-shrinkwrap.jsone package-lock.json(in quell'ordine).
  • senza argomenti : installa le dipendenze di un modulo locale.
  • Può installare pacchetti globali.
  • Installerà eventuali dipendenze mancanti in node_modules.
  • Potrebbe scrivere a package.jsono package-lock.json.
    • Se utilizzato con un argomento ( npm i packagename), può scrivere package.jsonper aggiungere o aggiornare la dipendenza.
    • se usato senza argomenti, ( npm i) può scrivere per package-lock.jsonbloccare la versione di alcune dipendenze se non sono già in questo file.

npm ci

  • Richiede almeno npm v5.7.1 .
  • Richiede package-lock.jsono npm-shrinkwrap.jsonessere presente.
  • Genera un errore se le dipendenze da questi due file non corrispondono package.json.
  • Rimuove node_modulese installa tutte le dipendenze contemporaneamente.
  • Non scrive mai a package.jsono package-lock.json.

Algoritmo

Mentre npm cigenera l'intero albero delle dipendenze da package-lock.jsono npm-shrinkwrap.json, npm install aggiorna il contenutonode_modules dell'utilizzo del seguente algoritmo ( sorgente ):

load the existing node_modules tree from disk
clone the tree
fetch the package.json and assorted metadata and add it to the clone
walk the clone and add any missing dependencies
  dependencies will be added as close to the top as is possible
  without breaking any other modules
compare the original tree with the cloned tree and make a list of
actions to take to convert one to the other
execute all of the actions, deepest first
  kinds of actions are install, update, remove and move

1
Non sapevo che avrei npm installpotuto scrivere su package.json. Sai cosa potrebbe scrivere qui?
Veve,

5
beh, potrebbe essere un po 'fuorviante ... scriverà su package.json quando lo usi per installare, aggiornare o rimuovere le dipendenze. Lo renderò più chiaro nel testo, grazie!
lucascaro,

Dove è documentato questo algoritmo? Cioè qual è la tua fonte?
Yngvar Kristiansen,

1
@YngvarKristiansen è nella documentazione di npm, aggiunto un link alla sezione specifica per riferimento
lucascaro

4
npm install packagepotrebbe modificare entrambi package-lock.json e package.json , mentre npm installsenza argomenti cambierebbe solopackage-lock.json
knobo

20

npm cieliminerà qualsiasi cartella node_modules esistente e si affida al package-lock.jsonfile per installare la versione specifica di ciascun pacchetto. È significativamente più veloce dell'installazione di npm perché salta alcune funzionalità. Il suo stato pulito è perfetto per pipeline ci / cd e build docker! Lo usi anche per installare tutto in una volta e non pacchetti specifici.


9

La documentazione che hai collegato aveva il riassunto:

In breve, le principali differenze tra l'utilizzo di npm install e npm ci sono:

  • Il progetto deve avere un pacchetto-lock.json o npm-shrinkwrap.json esistente.
  • Se le dipendenze nel blocco del pacchetto non corrispondono a quelle in package.json, npm ci uscirà con un errore, invece di aggiornare il blocco del pacchetto.
  • npm ci può installare interi progetti alla volta: non è possibile aggiungere singole dipendenze con questo comando.
  • Se un node_modules è già presente, verrà automaticamente rimosso prima che npm ci inizi l'installazione.
  • Non scriverà mai su package.json o su uno dei pacchetti-lock: le installazioni sono essenzialmente bloccate.

2

I comandi sono molto simili nella funzionalità, tuttavia la differenza sta nell'approccio adottato per installare le dipendenze specificate in your package.jsone package-lock.jsonfiles.

npm ciesegue un'installazione pulita di tutte le dipendenze della tua app mentre npm installpotrebbe saltare alcune installazioni se già esistono sul sistema. Un problema può sorgere se la versione già installata sul sistema non è quella che si package.jsonintende installare, ovvero la versione installata è diversa dalla versione " richiesta ".

Altre differenze sarebbero quelle che npm cinon toccano mai i tuoi package*.jsonfile. Arresterà l'installazione e mostrerà un errore se le versioni di dipendenza non corrispondono nei file package.jsone package-lock.json.

Puoi leggere una spiegazione molto migliore dai documenti ufficiali qui .

Inoltre, potresti voler leggere qui sui blocchi dei pacchetti .


1

Vale la pena ricordare che nelle immagini docker dei nodi di luce come alpine non è installato Python, che è una dipendenza node-gyputilizzata da npm ci.

Penso che sia un po 'supposto che, per npm cifunzionare, devi installare Python come dipendenza nella tua build.

Maggiori informazioni qui Docker e npm - gyp ERR! non bene


0

Mentre tutti gli altri hanno risposto alle differenze tecniche nessuno spiega in quali situazioni utilizzare entrambi.

Dovresti usarli in diverse situazioni.

npm installè ottimo per lo sviluppo e nell'IC quando si desidera memorizzare nella cache la node_modulesdirectory. Quando usarlo? Puoi farlo se stai creando un pacchetto che può essere utilizzato da altre persone (NON includi node_modulesin tale rilascio) . Per quanto riguarda la memorizzazione nella cache, fai attenzione, se prevedi di supportare versioni diverse di Node.jsRemember che node_modulespotrebbero dover essere reinstallate a causa delle differenze tra i Node.jsrequisiti di runtime. Se si desidera attenersi a una versione, attenersi all'ultima LTS.

npm cidovrebbe essere usato quando si deve testare e rilasciare un'applicazione di produzione (un prodotto finale, che non deve essere utilizzato da altri pacchetti) poiché è importante che l'installazione sia il più deterministica possibile, questa installazione richiederà più tempo ma alla fine renderà la tua applicazione più affidabile (includi node_modulesin tale versione) . Stick con la LTSversione di Node.js.

Bonus: potresti mescolarli a seconda di quanto vuoi renderlo complesso. Sui rami delle funzionalità gitè possibile memorizzare nella cache node_modulesper aumentare la produttività dei team e sulla richiesta di unione e le filiali principali si affidano a npm ciun risultato deterministico.

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.