Probabilmente hai qualcosa del tipo:
"typescript":"~2.1.6"
nel package.json
quale npm si aggiorna all'ultima versione minore, nel tuo caso2.4.1
Modifica: domanda dall'OP
Ma ciò non spiega perché "npm install" cambierebbe il file di blocco. Il file di blocco non è pensato per creare una build riproducibile? In tal caso, indipendentemente dal valore del semver, dovrebbe comunque utilizzare la stessa versione 2.1.6.
Risposta:
Questo ha lo scopo di bloccare l'intero albero delle dipendenze. Diciamo che typescript v2.4.1
richiede widget ~v1.0.0
. Quando si installa npm lo prende widget v1.0.0
. Successivamente il tuo collega sviluppatore (o build CI) esegue un'installazione npm e ottiene typescript v2.4.1
ma widget
è stato aggiornato a widget v1.0.1
. Ora il tuo modulo nodo non è sincronizzato. Questo è ciò che package-lock.json
impedisce.
O più in generale:
Ad esempio, considera
pacchetto A:
{"name": "A", "version": "0.1.0", "dependencies": {"B": "<0.1.0"}}
pacchetto B:
{"name": "B", "version": "0.0.1", "dependencies": {"C": "<0.1.0"}}
e pacchetto C:
{"name": "C", "version": "0.0.1"}
Se queste sono le uniche versioni di A, B e C disponibili nel registro, verrà installata una normale installazione npm A:
A@0.1.0 - B@0.0.1 - C@0.0.1
Tuttavia, se viene pubblicato B@0.0.2, verrà installata una nuova installazione npm A:
A@0.1.0 - B@0.0.2 - C@0.0.1 supponendo che la nuova versione non abbia modificato le dipendenze di B. Naturalmente, la nuova versione di B potrebbe includere una nuova versione di C e un numero qualsiasi di nuove dipendenze. Se tali modifiche sono indesiderabili, l'autore di A potrebbe specificare una dipendenza da B@0.0.1. Tuttavia, se l'autore di A e l'autore di B non sono la stessa persona, non c'è modo per l'autore di dire che non vuole inserire le versioni di C pubblicate di recente quando B non è cambiato affatto.
Domanda OP 2: Fammi vedere se ho capito bene. Quello che stai dicendo è che il file lock specifica le versioni delle dipendenze secondarie, ma si basa ancora sulla corrispondenza fuzzy di package.json per determinare le dipendenze di livello superiore. È preciso?
Risposta: No. package-lock blocca l'intero albero dei pacchetti, inclusi i pacchetti root descritti in package.json
. Se typescript
è bloccato 2.4.1
nel tuo package-lock.json
, dovrebbe rimanere tale fino a quando non viene modificato. E diciamo che domani typescript
rilascia la versione 2.4.2
. Se controllo il tuo ramo ed npm install
eseguo, npm rispetterà il file di blocco e l'installazione 2.4.1
.
Maggiori informazioni su package-lock.json
:
package-lock.json viene generato automaticamente per qualsiasi operazione in cui npm modifica l'albero node_modules o package.json. Descrive l'albero esatto che è stato generato, in modo che le installazioni successive siano in grado di generare alberi identici, indipendentemente dagli aggiornamenti di dipendenza intermedi.
Questo file è destinato al commit nei repository di origine e serve a vari scopi:
Descrivere una singola rappresentazione di un albero delle dipendenze in modo tale che i compagni di squadra, le distribuzioni e l'integrazione continua possano installare esattamente le stesse dipendenze.
Fornire agli utenti la possibilità di "viaggiare nel tempo" verso gli stati precedenti di node_modules senza dover eseguire il commit della directory stessa.
Per facilitare una maggiore visibilità delle modifiche dell'albero mediante differenze di controllo della sorgente leggibili.
E ottimizza il processo di installazione consentendo a npm di saltare ripetute risoluzioni dei metadati per i pacchetti precedentemente installati.
https://docs.npmjs.com/files/package-lock.json