Qual è il ruolo di package-lock.json?


291

npm @ 5 è stato pubblicato, ha una nuova funzione package-lock.json (dopo npm install) che mi confonde. Voglio sapere, qual è l'effetto di questo file?

Risposte:


291

Memorizza un albero delle dipendenze esatto e con versione anziché utilizzare il controllo delle versioni stellato come package.json stesso (ad esempio 1.0. *). Questo significa che puoi garantire le dipendenze per altri sviluppatori o rilasci di prodotti, ecc. Ha anche un meccanismo per bloccare l'albero ma generalmente si rigenererà se cambia package.json.

Dai documenti di npm :

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 tale 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 di metadati per i pacchetti precedentemente installati. "

modificare

Per rispondere alla domanda di jrahhali di seguito sull'utilizzo del pacchetto.json con i numeri esatti di versione. Ricorda che package.json contiene solo le tue dipendenze dirette, non le dipendenze delle tue dipendenze (a volte chiamate dipendenze nidificate). Ciò significa che con package.json standard non è possibile controllare le versioni di tali dipendenze nidificate, fare riferimento a esse direttamente o poiché le dipendenze peer non sono di aiuto poiché non si controlla la tolleranza di versione definita dalle dipendenze dirette per queste dipendenze nidificate .

Anche se blocchi le versioni delle tue dipendenze dirette, non puoi garantire al 100% che l'albero delle dipendenze sia sempre identico. In secondo luogo, potresti voler consentire modifiche continue (basate sul controllo delle versioni semantico) delle tue dipendenze dirette che ti danno ancora meno controllo delle dipendenze nidificate e di nuovo non puoi garantire che le tue dipendenze dirette non infrangano le regole di versione semantiche loro stessi.

La soluzione a tutto ciò è il file di blocco che come descritto sopra blocca le versioni dell'albero delle dipendenze completo. Ciò consente di garantire il proprio albero delle dipendenze per altri sviluppatori o rilasci, pur continuando a testare nuove versioni delle dipendenze (dirette o indirette) utilizzando il pacchetto standard.json.

NB. Il precedente film termoretraibile json ha fatto praticamente la stessa cosa, ma il file di blocco lo rinomina in modo che la sua funzione sia più chiara. Se nel progetto è già presente un file di ridimensionamento, questo verrà utilizzato al posto di qualsiasi file di blocco.


78
Se è richiesta una versione esatta delle dipendenze, perché non imporre di specificare la versione esatta in package.json e rinunciare a un file package-lock.json?
Jrahhali,

15
@jrahhali - ho modificato la mia risposta in base alla tua domanda.
Matt,

1
Come viene applicato l'albero delle dipendenze di pacakge.json.lock per altri sviluppatori? Automaticamente?
Steve K,

40
Nota che questa risposta non è più corretta ! Il package-lock.jsonfile viene aggiornato ogni volta che si chiama npm install da NPM 5.1. (modifica in github.com/npm/npm/issues/16866 , esempio in github.com/npm/npm/issues/17979 ) Pertanto non può più essere utilizzato per impostare le stesse versioni per tutti gli sviluppatori , a meno che non si specifichino versioni esatte come 1.2.3invece che 1.2.*nel tuo package.jsonfile.
Christian,

5
Dovresti aggiungere un riferimento a npm cicome npm installaggiornerà il pacchetto-lock.json mentre ci usa il suo contenuto. Solo con npm ciotterrai build robuste ripetibili.
k0pernikus,

34

È un miglioramento molto importante per npm: garantire esattamente la stessa versione di ogni pacchetto .

Come assicurarsi che il progetto sia stato realizzato con gli stessi pacchetti in ambienti diversi in tempi diversi? Supponiamo che tu possa usare il ^1.2.3tuo package.json, o che alcune delle tue dipendenze stiano usando in quel modo, ma come puoi assicurarti che ogni volta npm installprenderà la stessa versione nella tua macchina di sviluppo e nel server di build? package-lock.json lo garantirà.

npm installrigenererà il file di blocco, quando su build server o server di distribuzione, fare npm ci(che leggerà dal file di blocco e installerà l'intero albero del pacchetto)


9
Si noti che questo è un po 'obsoleto ora. A partire dalla 5.1.0, "npm install" non legge affatto dal package-lock.jsonfile. Si installa da package.jsoncome una volta. Per utilizzare il package-lock.jsonfile, è necessario utilizzare il nuovo comando "npm ci", che installerà le versioni esatte elencate in package-lock.jsoninvece degli intervalli di versione indicati package.json.
Venryx,

5
Temo che Venryx non sia corretto. npm install non leggere package-lock.json. Per riprodurre, procedi come segue. usando questo package.json, esegui npm install{... "devDependencies": {"sinon": "7.2.2"}} Ora copia / incolla package.jsone package-lock.jsonin una nuova directory. Passare package.jsona: "sinon": "^ 7.2.2" eseguito npm install. npm legge da package-lock.json e installa 7.2.2 invece di 7.3.0. Senza package-lock.json, sarebbe installato 7.3.0.
Zumafra,

2
E non solo, ma se vuoi fare qualcosa come aggiungere il cursore ^ package-lock.json, l'unico modo ragionevole per farlo è quello di eliminarlo package-lock.jsone rigenerarlo usando npm install. (Non si desidera modificare manualmente package-lock.json). La modifica del valore della proprietà "version" (nella parte superiore) di package.jsoncambierà lo stesso in package-lock.jsonon npm install, ma l'aggiunta di un cursore a una dipendenza non farà lo stesso package-lock.json.
zumafra,

1
Pensa package.jsona qualcosa che puoi modificare manualmente e package-lock.jsoncome qualcosa che non tocchi mai manualmente. Controlli sempre la versione ENTRAMBI i file, in particolare package-lock.json. Apri entrambi i file, modifica manualmente il nome del progetto package.json, esegui npm installe osserva come cambia il nome del progetto package-lock.json. licensenon sembra essere registrato package-lock.json.
Zumafra,

2
Il file @zumafra package-lock.json verrà utilizzato durante l'operazione npm ci, npm installutilizzerà semplicemente package.json, anche se viene fornito il file di blocco
Xin

13

package-lock.jsonviene scritto quando viene modificato un valore numerico in una proprietà come la proprietà "version" o una proprietà di dipendenza package.json.

Se questi valori numerici corrispondono package.jsone package-lock.jsoncorrispondono, package-lock.jsonviene letto da.

Se questi valori numerici sono package.jsone package-lock.jsonnon corrispondono, package-lock.jsonviene scritto con quei nuovi valori e nuovi modificatori come il cursore e la tilde se sono presenti. Ma è il numero che sta innescando la modifica package-lock.json.

Per vedere cosa intendo, procedi come segue. Usando package.jsonsenza package-lock.json, esegui npm installcon:

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "7.2.2"
  }
}

package-lock.json ora avrà:

"sinon": {
  "version": "7.2.2",

Ora copia / incolla entrambi i file in una nuova directory. Passa package.jsona (solo aggiungendo il cursore):

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "^7.2.2"
  }
}

corri npm install. Se non ci fossero package-lock.jsonfile, verrebbe installato sinon@7.3.0. npm installsta leggendo package-lock.json e installando 7.2.2.

Ora cambia package.jsonin:

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "^7.3.0"
  }
}

corri npm install. package-lock.jsonè stato scritto in e ora mostrerà:

"sinon": {
  "version": "^7.3.0",

7

Una cosa importante da menzionare è anche il miglioramento della sicurezza fornito con il file di blocco dei pacchetti. Dal momento che mantiene tutti gli hash dei pacchetti se qualcuno manometterebbe il registro npm pubblico e cambierebbe il codice sorgente di un pacchetto senza nemmeno cambiare la versione del pacchetto stesso, sarebbe rilevato dal file di blocco dei pacchetti.


4

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 tale che le installazioni successive siano in grado di generare alberi identici, indipendentemente dagli aggiornamenti di dipendenza intermedi.

Descrive 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 e contiene le seguenti proprietà.

    {
"name": "mobileapp",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@angular-devkit/architect": {
  "version": "0.11.4",
  "resolved": "https://registry.npmjs.org/@angular- devkit/architect/-/architect-0.11.4.tgz",
  "integrity": "sha512-2zi6S9tPlk52vyqNFg==",
  "dev": true,
  "requires": {
    "@angular-devkit/core": "7.1.4",
    "rxjs": "6.3.3"
  }
},

}


2

Questo file viene creato e utilizzato automaticamente da npm per tenere traccia delle installazioni dei pacchetti e per gestire meglio lo stato e la cronologia delle dipendenze del progetto. Non dovresti alterare il contenuto di questo file.


1
quindi cosa succede se riscontro un conflitto con questo file?
Oliver Watkins, il

0

package-lock.json: contiene i dettagli esatti della versione attualmente installata per la tua applicazione.


1
Ciao e benvenuto. Questa domanda ha già ricevuto risposta. Devi verificare se la domanda è stata contrassegnata come risposta vedendo se una delle risposte ha un segno di spunta verde di fronte.
Néstor,
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.