Npm-shrinkwrap.json ve package-lock.json arasındaki fark nedir?


158

İle 5 @ NPM serbest bırakılması , artık bir yazacak package-lock.jsonbir sürece npm-shrinkwrap.jsonzaten var.

Küresel olarak npm @ 5'i yükledim:

npm install npm@5 -g

Ve şimdi, a npm-shrinkwrap.jsonsırasında bulunursa:

npm install

bir uyarı yazdırılacaktır:

npm WARN read-shrinkwrap This version of npm
is compatible with lockfileVersion@1,
but npm-shrinkwrap.json was generated for lockfileVersion@0.
I'll try to do my best with it!

Yani götürmem, şirinkini yerine koymam gerektiğidir package-lock.json.

Ancak bunun için neden yeni bir biçim var? Ne olabilir package-lock.jsonbunu npm-shrinkwrap.jsonyapamaz?

Yanıtlar:


176

Dosyalar tam olarak aynı içeriğe sahiptir, ancak ncs'in onları nasıl işlediğine dair , dokümanlar sitesinde ve npm deposundaki bu iki dosya arasındaki farkı açıkça ele alarak başlayan bir docs dosyasında bir avuç fark vardır :

  • package-lock.jsonnpm-shrinkwrapvarsayılan olarak hiçbir zaman npm'de yayınlanmaz
  • package-lock.json üst düzey pakette olmayan dosyalar yok sayılır, ancak bağımlılıklara ait shrinkwrap dosyalarına saygı gösterilir
  • npm-shrinkwrap.jsonnpm sürüm 2, 3 ve 4 ile geriye dönük uyumludur, ancak package-lock.jsonyalnızca npm 5+ ile tanınır

Varolan package-lock.jsonbir npm-shrinkwrap.jsondosyayı çalıştırarak dönüştürebilirsiniz npm shrinkwrap.

Böylece:

  • Paketinizi npm olarak yayınlamıyorsanız, bu iki dosya arasındaki seçimin önemi azdır. Kullanmak isteyebilirsiniz, package-lock.jsonçünkü bu varsayılan değerdir ve adı npm yeni başlayanlar için daha nettir; alternatif olarak, npm-shrinkwrap.jsongeliştirme ekibinizdeki herkesin npm 5+ üzerinde olduğundan emin olmanız zorsa, npm 2-4 ile geriye dönük uyumluluk için kullanmak isteyebilirsiniz . (Npm 5'in 25 Mayıs 2017'de piyasaya sürüldüğünü unutmayın; çoğu insan nihayetinde yükseleceği için geriye dönük uyumluluk o tarihten itibaren daha da önemli hale gelecektir.)
  • Eğer varsa edilmektedir NPM için paketinizi yayınlayarak, sen arasında bir seçim:

    1. Bir kullanarak package-lock.jsontam yüklü bağımlılıkları hangi sürümlerini kaydetmek için, ancak sürümü tarafından dikte aralıkları ile paketi yüklemeden insanlar uyumludur bağımlılıkları herhangi bir sürümünü kullanmak için izin package.jsonveya
    2. Bir kullanarak npm-shrinkwrap.jsonpaketinizi yükleyen herkesin alır garanti etmek tam olarak tüm bağımlılıkları aynı sürümü


    Dokümanlarda (çok tersine) açıklanan resmi görüş, seçenek 1'in kütüphaneler için kullanılması gerektiğidir (muhtemelen bir paket bağımlılığının birçoğu aynı ikincil bağımlılığın biraz farklı sürümlerine bağlı olduğunda oluşan paket çoğaltma miktarını azaltmak için) ancak bu seçenek 2, genel olarak yüklenecek olan yürütülebilir dosyalar için makul olabilir.


2
+1 - İkinci mermi noktanızı netleştirebilir misiniz? Bu davranış ile npm-shrinkwrap'e sahip olmak arasındaki fark nedir?
Rhys

2
@ Tuhaf bir şey yapmadıkça ikinci mermi pratikte önemli olmayacak. Temel olarak, bir kütüphane bir şekilde bir yayın yaptıysapackage-lock.json (ki bu mümkün değildir), o zaman bu kütüphaneyi başka bir paketin bağımlılığı olarak kuracak olursanız, kütüphanenin package-lock.jsonNPM tarafından göz ardı edileceğini söyler . Ancak, kütüphane bir yayınlarsa npm-shrinkwrap.jsonve o zaman olacak, bir bağımlılık olarak kütüphane kurmak da ikincil bağımlılıklar olarak yüklemek tam versiyonları kütüphane yıllarda belirtilen tüm bağımlılıkları npm-shrinkwrap.json.
Mark Amery

Lütfen salt okunur olarak npm ciyüklenmesini sağlamak için var olanları ekleyebilir misiniz? package-lock.json( npm installMutasyon package-lock.jsonneden karışıklık ve potansiyel hataları ve avantajlarından almaz package-lock.jsonkendiliğinden.)
k0pernikus

@ k0pernikus nasıl arasında herhangi bir fark var sanmıyorum npm citutamaklar npm-shrinkwrap.jsonve package-lock.json- iki dosya arasındaki fark hakkında bu soruya alakasını nedir? Ayrıca, etrafında okuduktan sonra: Ben düşünüyorum " npm install... üstünlüğün almaz package-lock.json" NPM 5.4 beri olmuştur false - İnanıyorum npm installanı saygı package-lock sürece web sitenizden ile düpedüz uyumsuz package.jsonbu durumda ikinci öncelikli olacaktır. (Ama biraz JavaScript dünyasının dışındayım - bir şey eksik miyim?)
Mark Amery

27

NPM Geliştiricisinden Açıklama :

Fikir kesinlikle package-lock.json'un shrinkwrap teknolojisinde En Son ve En Büyük olması ve npm-shrinkwrap.json, kütüphaneleriyle tam bir node_modules'e sahip olan kütüphanelerini çok önemseyen değerli birkaç kişi için ayrılmaktır - ve npm @> = 2 kullanarak CI isteyenler için npm sürümünü çarpmak zorunda kalmadan belirli bir ağacı kurabilirler.

Yeni lockfile ("package-lock.json") temel olarak aynı kodun tümünü, npm-shrinkwrap ile tam olarak aynı formatta paylaşır (bunları birbirleri arasında yeniden adlandırabilirsiniz!). Bu aynı zamanda topluluğun anladığı bir şey: "kilit dosyası var" insanlarla çok daha hızlı tıklanıyor gibi görünüyor. Son olarak, yeni bir dosyaya sahip olmak, ana gönderide belirtilen izin yayınlama gibi garip şeyler yapmak zorunda kalmadan, shrinkwrap ile nispeten düşük riskli geri uyumluluğa sahip olabileceğimiz anlamına geliyordu.


18
Fark konusunda hala net değilim. Eğer npm-shrinkwrapben varsayalım .... kesin node_modules içindir package-lock.jsonaz kesin daha kilitliyor? Ve eğer öyleyse, kilitleme olmayan npm-shrinkwrapkilitleme nedir?
dman

yanlış anladın @ dman. package-lock npm-shrinkwrap'in yeni sürümüdür. package-lock devre dışı bırakılır (bu nedenle özelliği varsayılan olarak etkinleştirildiği için kaldırmanız gerekir), npm-shrinkwrap devre dışı bırakılır (bu nedenle etkinleştirmem gerekir, çünkü varsayılanım dahil değildir). onlar paket kilidi tanıttı neden 1. kullanıcı bağımlılıkları ile başa çıkmak için daha güvenli bir yolu var, çünkü varsayılan olarak etkin ve 2. adı "shrinkwrap" için oposite ne ima eder. npm-shrinkwrap, paket kilidinin şu anda sahip olmadığı bazı özel bağımlılık davranışı ayarlarına sahipti. npm-shrinkwrap artık kullanılmıyor.
SeriousM

10
bu yanlış. Paket kilidinin npm-shrinkwrap'in yeni sürümü olduğunu söyleyerek, bunun bir yedek olduğunu söylüyorsunuz. npm-shrinkwrap kullanımdan kaldırılmıştır ve package-lock.json ile farklılıkları vardır. Ayrıca, package-lock.json bir hata var iken npm-shrinkwrap değil ... böylece daha fazla vurgulamak böylece aynı kod değildir.
dman

Ayrıca package-lock.json müdahaleci. Bu nedenle, shrinkwrap açıkça oluşturulmalı ve ci sunucularında çakışmalara neden olmazken "npm i" olarak adlandırırsanız scm çakışmalarına neden olabilir. Evet, burada yanlış olabilirim.
norekhov

@ dman "npm-shrinkwrap değil" package-lock.json bir hata var " - hayır değil. Bağlantı kurduğunuz konuda bunun bir göstergesi yok; bahsetmiyor bile npm-shrinkwrap. Bir dönüştürme, cevabım belirttiği gibi package-lock.jsonbir karşı npm-shrinkwrap.jsonanlamıyla sadece dosyayı yeniden adlandırarak yapılır; onlar vardır "aynı kod".
Mark Amery

12

Bence fikir varsayılan olarak --save ve shrinkwrap olmaktı, ancak istenmediği yerde bir shrinkwrap ile ilgili olası sorunlardan kaçınmaktı. Yani, herhangi bir çatışmayı önlemek için sadece yeni bir dosya adı verdiler. Npm'den biri burada daha ayrıntılı olarak açıkladı:

https://www.reddit.com/r/javascript/comments/6dgnnq/npm_v500_released_save_by_default_lockfile_better/di3mjuk/

İlgili teklif:

npm varsayılan olarak kaynak dizininizdeki çoğu dosyayı yayınlar ve insanlar yıllardır küçültme paketleri yayınlamaktadır. Uyumluluğu kırmak istemedik. --Save ve shrinkwrap varsayılan olarak, yanlışlıkla kaydettirme ve kayıt defterine geçirme ve temelde deps ve veri tekilleştirme ... null.

Bu yüzden yeni bir isim seçtik. Ve aniden yeni bir isim seçtik. Yeni kilit dosyası temelde aynı kodun tamamını, aynı formatı paylaşır

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.