Risposte:
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 install
legge package.json
per creare un elenco di dipendenze e utilizza package-lock.json
per 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.json
e usi package.json
solo per verificare che non vi siano versioni non corrispondenti. Se mancano delle dipendenze o hanno versioni incompatibili, verrà generato un errore .
Utilizzare npm install
per 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 ci
in questo caso.
Utilizzare npm ci
se è 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
npm-shrinkwrap.json
e package-lock.json
(in quell'ordine).node_modules
.package.json
o package-lock.json
.
npm i packagename
), può scrivere package.json
per aggiungere o aggiornare la dipendenza.npm i
) può scrivere per package-lock.json
bloccare la versione di alcune dipendenze se non sono già in questo file.npm ci
package-lock.json
o npm-shrinkwrap.json
essere presente.package.json
.node_modules
e installa tutte le dipendenze contemporaneamente.package.json
o package-lock.json
.Mentre npm ci
genera l'intero albero delle dipendenze da package-lock.json
o 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
npm install package
potrebbe modificare entrambi package-lock.json
e package.json
, mentre npm install
senza argomenti cambierebbe solopackage-lock.json
npm ci
eliminerà qualsiasi cartella node_modules esistente e si affida al package-lock.json
file 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.
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.
I comandi sono molto simili nella funzionalità, tuttavia la differenza sta nell'approccio adottato per installare le dipendenze specificate in your package.json
e package-lock.json
files.
npm ci
esegue un'installazione pulita di tutte le dipendenze della tua app mentre npm install
potrebbe saltare alcune installazioni se già esistono sul sistema. Un problema può sorgere se la versione già installata sul sistema non è quella che si package.json
intende installare, ovvero la versione installata è diversa dalla versione " richiesta ".
Altre differenze sarebbero quelle che npm ci
non toccano mai i tuoi package*.json
file. Arresterà l'installazione e mostrerà un errore se le versioni di dipendenza non corrispondono nei file package.json
e package-lock.json
.
Puoi leggere una spiegazione molto migliore dai documenti ufficiali qui .
Inoltre, potresti voler leggere qui sui blocchi dei pacchetti .
Vale la pena ricordare che nelle immagini docker dei nodi di luce come alpine non è installato Python, che è una dipendenza node-gyp
utilizzata da npm ci
.
Penso che sia un po 'supposto che, per npm ci
funzionare, devi installare Python come dipendenza nella tua build.
Maggiori informazioni qui Docker e npm - gyp ERR! non bene
Dovresti usarli in diverse situazioni.
npm install
è ottimo per lo sviluppo e nell'IC quando si desidera memorizzare nella cache la node_modules
directory. Quando usarlo? Puoi farlo se stai creando un pacchetto che può essere utilizzato da altre persone (NON includi node_modules
in tale rilascio) . Per quanto riguarda la memorizzazione nella cache, fai attenzione, se prevedi di supportare versioni diverse di Node.js
Remember che node_modules
potrebbero dover essere reinstallate a causa delle differenze tra i Node.js
requisiti di runtime. Se si desidera attenersi a una versione, attenersi all'ultima LTS
.
npm ci
dovrebbe 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_modules
in tale versione) . Stick con la LTS
versione di Node.js
.
Bonus: potresti mescolarli a seconda di quanto vuoi renderlo complesso. Sui rami delle funzionalità git
è possibile memorizzare nella cache node_modules
per aumentare la produttività dei team e sulla richiesta di unione e le filiali principali si affidano a npm ci
un risultato deterministico.
npm install
potuto scrivere su package.json. Sai cosa potrebbe scrivere qui?