Package-lock.json'nin rolü nedir?


291

npm @ 5 yayınlandı, beni şaşırtan yeni bir package-lock.json özelliği (sonra npm install) var. Bilmek istiyorum, bu dosyanın etkisi nedir?

Yanıtlar:


291

Package.json gibi yıldızlı sürümleri kullanmak yerine tam, sürümlendirilmiş bir bağımlılık ağacı saklar (örneğin 1.0. *). Bu, diğer geliştiriciler veya ürün sürümleri vb. İçin bağımlılıkları garanti edebileceğiniz anlamına gelir. Ayrıca ağacı kilitlemek için bir mekanizmaya sahiptir, ancak package.json değişirse genellikle yeniden oluşturulur.

Gönderen npm docs :

package-lock.json, npm'nin node_modules ağacını veya package.json dosyasını değiştirdiği tüm işlemler için otomatik olarak oluşturulur. Oluşturulan tam ağacı açıklar, böylece sonraki yüklemeler ara bağımlılık güncellemelerinden bağımsız olarak aynı ağaçları üretebilir.

Bu dosya kaynak depolarına ayrılmak üzere tasarlanmıştır ve çeşitli amaçlara hizmet eder:

Bir bağımlılık ağacının tek bir temsilini açıklayın, böylece takım arkadaşları, konuşlandırmalar ve sürekli entegrasyon tam olarak aynı bağımlılıkları kuracak şekilde garanti edilir.

Kullanıcılara, dizinin kendisini işlemek zorunda kalmadan önceki node_modules durumlarına "zaman yolculuğu" yapma olanağı sağlayın.

Okunabilir kaynak kontrol farkları ile ağaç değişikliklerinin daha iyi görünmesini kolaylaştırmak için.

Ve npm'in önceden yüklenmiş paketler için tekrarlanan meta veri çözünürlüklerini atlamasına izin vererek kurulum işlemini optimize edin. "

Düzenle

Jrahhali'nin aşağıdaki paketi sadece paket.json'u tam sürüm numaralarıyla kullanma ile cevaplamak için Package.json öğesinin, bağımlılıklarınızın (bazen iç içe bağımlılıklar olarak da adlandırılır) bağımlılıklarını değil, yalnızca doğrudan bağımlılıklarınızı içerdiğini unutmayın. Bu, standart paket.json ile iç içe bağımlılıkların sürümlerini doğrudan denetleyemeyeceğiniz anlamına gelir, doğrudan veya eş bağımlılıkları olarak başvuruda bulunmanız, doğrudan bağımlılıklarınızın bu iç içe bağımlılıklar için tanımladığı sürüm toleransını da denetlemediğiniz için yardımcı olmaz. .

Doğrudan bağımlılıklarınızın sürümlerini kilitleseniz bile,% 100 tam bağımlılık ağacınızın her seferinde aynı olacağını garanti edemezsiniz. İkinci olarak, doğrudan bağımlılıklarınızın iç içe bağımlılıkların daha da az kontrolünü sağlayan kırılmaz değişikliklere (anlamsal sürümlere dayalı olarak) izin vermek isteyebilirsiniz, ayrıca doğrudan bağımlılıklarınızın bir noktada anlamsal sürüm oluşturma kurallarını bozmayacağını garanti edemezsiniz. kendilerini.

Tüm bunların çözümü, yukarıda açıklandığı gibi tam bağımlılık ağacının sürümlerinde kilitlenen kilit dosyasıdır. Bu, standart paketinizi kullanarak yeni bağımlılık sürümlerinin (doğrudan veya dolaylı) test edilmesine izin verirken diğer geliştiriciler veya sürümler için bağımlılık ağacınızı garanti etmenizi sağlar.

NB. Önceki shrink wrap json hemen hemen aynı şeyi yaptı, ancak kilit dosyası işlevi daha net olacak şekilde yeniden adlandırır. Projede zaten bir shrink wrap dosyası varsa, bu herhangi bir kilit dosyası yerine kullanılır.


78
Bağımlılıkların tam bir sürümüne sahip olmak istenirse, neden package.json'da tam sürümü belirtmeyi zorlamıyorsunuz ve bir package-lock.json dosyasını terk etmiyorsunuz?
jrahhali

15
@jrahhali - cevabımı sorunuza göre değiştirdi.
Matt

1
Bu bağımlılık ağacı pacakge.json.lock'tan diğer geliştiriciler için nasıl uygulanır? Otomatik olarak?
stevek

40
Bu cevabın artık doğru olmadığını lütfen unutmayın ! package-lock.jsonDosya güncellenmektedir yüklemek npm diyoruz her seferinde NPM 5.1 beri. (değişim github.com/npm/npm/issues/16866 , örnek github.com/npm/npm/issues/17979 ) Dolayısıyla edebilir artık tüm geliştiriciler için aynı versiyonlarını ayarlamak için kullanılabilir Eğer tam sürümlerini belirtmedikçe, gibi 1.2.3yerine 1.2.*sizin de package.jsondosyaya.
Christian

5
Sen bir başvuru eklemek gerekir npm ciolarak npm installci içeriğini kullanır oysa paket lock.json güncelleyecektir. Sadece ile npm citekrarlanabilir sağlam yapılar elde edersiniz.
k0pernikus

34

Npm için çok önemli bir gelişme: her paketin tam olarak aynı sürümünü garanti edin .

Projenizin farklı ortamlarda aynı paketlerle farklı bir zamanda oluşturulduğundan nasıl emin olabilirsiniz? Diyelim diyelim sen kullanabilir ^1.2.3Gözlerinde farklı package.jsonveya bağımlılıkları bazı bu şekilde kullanıyor, ama nasıl u her zaman sağlayabilirsiniz npm installsenin dev makine ve derleme sunucusu aynı sürümünü alacak? package-lock.json bunu sağlayacaktır.

npm installyapı sunucusunda veya dağıtım sunucusundayken kilit dosyasını yeniden oluşturur (kilit dosyasından npm ciokuyacak ve tüm paket ağacını kuracaktır)


9
Bunun artık modası geçmiş olduğunu unutmayın. 5.1.0 ve sonrasında "npm install" package-lock.jsondosyadan hiç okumuyor . Sadece eskiden olduğu package.jsongibi yüklenir . Make kullanımı için package-lock.jsondosyada, sen listelenen tam sürümlerini yükleyin edecek olan yeni "npm ci" komutunu kullanmak zorunda package-lock.jsonyerine verilen versiyonu-aralıkların package.json.
Venryx

5
Korkarım Venryx yanlış. npm install gelmez okunan package-lock.json. Çoğaltmak için aşağıdakileri yapın. bu package.json npm installdosyasını kullanarak {... "devDependencies": {"sinon": "7.2.2"}} Şimdi kopyalayıp yapıştırın package.jsonve package-lock.jsonyeni bir dizine kopyalayın . Değiştir package.json: "sinon": "^ 7.2.2" çalıştırın npm install. npm package-lock.json dosyasından okur ve 7.3.0 yerine 7.2.2 yükler. Package-lock.json olmadan, 7.3.0 yüklenecekti.
zumafra

2
Ve sadece bu değil, aynı zamanda caret ^ 'i eklemek gibi bir şey yapmak istiyorsanız, bunu package-lock.jsonyapmanın tek makul yolu package-lock.jsononu kullanarak silmek ve yeniden oluşturmaktır npm install. (Manuel olarak düzenlemek istemezsiniz package-lock.json). Arasında (üst kısmına yakın) "sürüm" özelliğinin değerinin değiştirilmesi package.jsonaynı değişecek package-lock.jsonüzerinde npm install, ama bir bağımlılık için bir şapka eklemenin aynısını yapmaz package-lock.json.
zumafra

1
package.jsonManuel olarak değiştirebileceğiniz ve package-lock.jsonasla manuel olarak dokunmadığınız bir şey olarak düşünün . Her zaman BOTH dosyaları sürüm kontrolü - özellikle package-lock.json. Her iki dosyayı da açın, proje adını elle düzenleyin package.json, çalıştırın npm installve proje adının nasıl değiştiğini izleyin package-lock.json. licensekaydedilmemiş gibi görünüyor package-lock.json.
zumafra

2
yaparken @zumafra paket lock.json dosya kullanımını olacak npm ci, npm installsadece kilit dosyası sağlanır rağmen package.json kullanacak
Xin

13

package-lock.json, "version" özelliği gibi bir özellikteki sayısal değer veya bağımlılık özelliği olarak değiştirildiğinde yazılır package.json.

Bu sayısal değerler package.jsonve package-lock.jsoneşleşirse, package-lock.jsonöğesinden okunur.

Bu sayısal değerler eşleşirse package.jsonve package-lock.jsoneşleşmezse, package-lock.jsonbu yeni değerlerle ve mevcutsa düzeltme işareti ve tilde gibi yeni değiştiricilerle yazılır. Ancak, değişikliği tetikleyen rakamdır package-lock.json.

Ne demek istediğimi görmek için aşağıdakileri yapın. Kullanılması package.jsonolmadan package-lock.jsonçalıştırmak npm installile:

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

package-lock.json şimdi sahip olacak:

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

Şimdi her iki dosyayı da yeni bir dizine kopyalayın / yapıştırın. Değiştir package.json(yalnızca düzeltme eki ekleyerek):

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

çalıştırın npm install. package-lock.jsonDosya yoksa , sinon@7.3.0 yüklenir. npm installolduğu okuma package-lock.json ve 7.2.2 yüklemeden.

Şimdi şu şekilde değiştirin package.json:

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

çalıştırın npm install. package-lock.jsonkonudur yazılır ve şimdi gösterecektir:

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

7

Bahsetmek gereken önemli bir şey de paket kilidi dosyası ile gelen güvenlik geliştirmesidir. Birisi genel npm kayıt defterine müdahale edip paketin kendisinin sürümünü değiştirmeden bir paketin kaynak kodunu değiştirirse, paketlerin tüm karmasını koruduğundan, paket kilit dosyası tarafından algılanır.


4

package-lock.json, npm'nin node_modules ağacını veya package.json dosyasını değiştirdiği tüm işlemler için otomatik olarak oluşturulur. Oluşturulan tam ağacı açıklar, böylece sonraki yüklemeler ara bağımlılık güncellemelerinden bağımsız olarak aynı ağaçları üretebilir.

Takım arkadaşlarının, konuşlandırmaların ve sürekli entegrasyonun tam olarak aynı bağımlılıkları kurması garanti edilecek şekilde bir bağımlılık ağacının tek bir temsilini açıklar.

    {
"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

Bu dosya otomatik olarak oluşturulur ve npm tarafından paket kurulumlarınızı takip etmek ve projenizin bağımlılıklarının durumunu ve geçmişini daha iyi yönetmek için kullanılır. Bu dosyanın içeriğini değiştirmemelisiniz.


1
bu dosyayla bir çakışma olursa ne olur?
Oliver Watkins

0

package-lock.json: Uygulamanız için şu anda yüklü olan tam sürüm ayrıntılarını içerir.


1
Merhaba, hoş geldiniz. Bu soru zaten cevaplandı. Yanıtların herhangi birinin önünde yeşil bir onay işareti olup olmadığını görmek için sorunun yanıt olarak işaretlenip işaretlenmediğini doğrulamanız gerekir.
Néstor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.