Npm 5 tarafından oluşturulan package-lock.json dosyasını teslim edebilir miyim?


1394

npm 5 bugün piyasaya sürüldü ve yeni özelliklerden biri package-lock.jsondosya oluşturma ile deterministik yüklemeleri içeriyor .

Bu dosyanın kaynak kontrolünde tutulması gerekiyor mu?

Her ikisinin de kaynak kontrolünde tutulması gerekiyordu yarn.lockve composer.lockher ikisinin de kaynak kontrolünde tutulması gerekiyor.


20
Kısa cevap: evet. Bir yorum: package-lock.json değiştiğinde, diğer kaynak değişikliklerinden ayrı olarak yalnızca bu değişikliğin taahhüdünü verebilirsiniz. Bu git logbaşa çıkmayı kolaylaştırır.
Purplejacket

14
Bir dosya yoksa, deterministik bir kurulum üretmeye yardımcı olamaz.
Alan H.

4
Projeye bağlıdır. github.com/npm/npm/issues/20603
Gajus

3
Npm'ye gerçekten güveniyorsanız, amaç projenin ne kullandığını daha açık bir şekilde bildirmektir. Gerçekten öngörülebilirlik istiyorsanız bu dosyayı yok sayın ve bunun yerine node_modules (yanıtlar + yorumunda .npmrc ve ilgili yapılandırmaya bakın) yükleyin ve bunu paket yöneticinizin yaptığı şeyi yerine gerçekte nelerin değiştiğini izlemek için kullanın. Sonuçta: hangisi daha önemli? Paket yöneticiniz veya kullandığınız kod.
jimmont

Yanıtlar:


1615

Evet, package-lock.jsonkaynak kontrolünde kontrol edilmesi amaçlanmıştır. Npm 5 kullanıyorsanız, bunu komut satırında görebilirsiniz: created a lockfile as package-lock.json. You should commit this file.Buna göre npm help package-lock.json:

package-lock.jsonnpm'nin node_modulesağacı veya değerini değiştirdiği tüm işlemler için otomatik olarak oluşturulur package.json. 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ıların node_modulesdizinin kendisini işlemek zorunda kalmadan önceki durumlarına "zaman yolculuğu" yapmaları için bir olanak 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.

Hakkında önemli bir ayrıntı package-lock.json, yayınlanamayacağı ve üst düzey paket dışında herhangi bir yerde bulunması durumunda yok sayılacaktır. Aslında aynı dosya olan npm-shrinkwrap.json (5) ile bir formatı paylaşır, ancak yayına izin verir. Bir CLI aracı dağıtılmadıkça veya başka bir şekilde üretim paketleri üretmek için yayınlama işlemi kullanılmadıkça bu önerilmez.

Her ikisi de package-lock.jsonve npm-shrinkwrap.jsonbir paketin kökünde varsa, package-lock.jsontamamen göz ardı edilecektir.


77
Ne tür projelerde dosyayı yürütmek gerçekten yararlıdır? Semver ve package.json'un tüm amacı, güncellenmiş uyumlu bağımlılıkların not edilmesine gerek olmamasıdır.
curiousdannii

45
Anahtar kelime "olması gerekmemelidir" - ancak pratikte insanlar semver'i mükemmel şekilde takip etmezler. Bu nedenle, paketlerin güncellenmesini kolaylaştırmak için yine de her geliştiricinin ve dağıtılan her uygulamanın aynı bağımlılık ağacını kullandığından emin olmak için package-lock.json ve package.json dosyalarını birlikte kullanabilirsiniz.
Panu Horsmalahti

34
@trusktr: Sindre Sorhus "Uygulamalar için kilit dosyaları değil, paketler için değil" kullanmanızı önerir .
vine77

23
Başka bir şey, package-lock.json'un NPM'de yayınlanması için yok sayılır, bu nedenle bir geliştirici bir kütüphane geliştiricisi için kullanıyorsa, güncellenmiş bir bağımlılık sürümünden bir gerileme yakalama şansını en aza indirir ve bu nedenle son kullanıcılara hata. Bu nedenle, kütüphane geliştiricisi için bir kilit dosyası kullanılmaması, daha az hata gönderme şansını artırır.
trusktr

128
Şahsen şimdi package-lock.jsonbenim eklemek için başvurmak zorunda kaldım .gitignore... bu onları çözmekten çok daha fazla soruna neden oluyordu. Birleştirdiğimizde veya yeniden birleştirdiğimizde her zaman çakışır ve birleştirme package-lock.jsonCI sunucusunda bozulmaya neden olduğunda , düzeltmeye devam etmek sadece bir acıdır.
Stefan Z Camilleri

111

Evet, check-in yapılması amaçlanıyor. Kendi benzersiz taahhüdünü almasını önermek istiyorum. Farklarımıza çok fazla gürültü kattığını görüyoruz.


19
kaynak kod deponuzda kontrol edilmesi gerekip gerekmediğini tartışmak adil, ancak bu dosyayı npm'de yayınlamak gerçekten tartışmaya açık değildir - package-lock.json dosyanızı veya shrinkwrap dosyanızı npm kayıt defterinize eklemeniz gerekir. bunu yapmazsanız, yayınlanan paketiniz 1. nesil bağımlılıklarınızın sabit olmayan sabit değişikliklerine tabi olacaktır. bu 2. + nesil bağımlılıklardan biri kesin bir değişiklik yayınlayana ve yayınlanan paketiniz gizemli bir şekilde kırılıncaya kadar bunun bir sorun olduğunu fark etmeyeceksiniz. bu package-lock.json dosyası bu sorunu çözmek için oluşturuldu.
guerillapresident

9
@BetoAveiga Gürültü ile paket-lock.json ile yapılan işlemlerin çok sayıda düğüm paketi sürümüne sahip olabileceği anlamına gelir, bu işlemdeki diğer işler gizlenir.
xer0x

7
Paket kurulumlarını genellikle diğer işlerden ayrı tutarım. Asla "Takılı chai ve mocha" gibi bir taahhüdü dağıtmam gerekmiyor, çünkü neyin değiştiğini zaten biliyorum.
Keith

3
package-lock.jsonSandıklar ve dallanma ile bir SCM sistemi üzerinde çalışırken dosya ile ilgili herhangi bir tavsiye ? Bir şubede gövdeye birleştirilmesi gereken bazı değişiklikler yapıyorum ... şimdi (bir şekilde) iki package-lock.jsondosya arasındaki çakışmaları çözmek zorunda mıyım ? Bu acı veriyor.
kmiklas

3
@guerillapresident Anladığım kadarıyla, kısmen haklısın. Bu dosyayı npm'de yayınlamak tartışmaya açık değildir. Yayınlayamazsınız.
Tim Gautier

66

Evet yapmalısın:

  1. taahhüt etmek package-lock.json.
  2. npm cinpm installuygulamalarınızı hem CI'nizde hem de yerel geliştirme makinenizde oluşturmak yerine kullanın

npm ciİş akışı gerektiren bir varlığını package-lock.json.


npm installKomutun büyük bir dezavantajı, değiştirebileceği beklenmedik davranışıdır package-lock.json, oysa npm cisadece kilit dosyasında belirtilen sürümleri kullanır ve bir hata oluşturur

  • package-lock.jsonve package.jsonsenkronize değilse
  • a package-lock.jsoneksikse.

Bu nedenle, npm installyerel olarak çalışıyor , esp. birden fazla geliştiriciye sahip daha büyük ekiplerde, package-lock.jsonve geliştiriciler içinde çok sayıda çatışmaya yol açabilir ve package-lock.jsonbunun yerine geliştiriciler bunun tamamen silinmesine karar verebilir .

Ancak, projenin bağımlılıklarının farklı makineler arasında güvenilir bir şekilde tekrarlanabilir bir şekilde çözüleceğine güvenebilmek için güçlü bir kullanım örneği vardır.

Birinden package-lock.jsontam olarak şunu elde edersiniz: çalıştığı bilinen bir durum.

Geçmişte, rastgele bir bağımlılığın son güncelleme yaptığı için derlemesi başarısız olacak package-lock.json/ npm-shrinkwrap.json/ yarn.lockdosyaları olmayan projelerim vardı .

Bazen son çalışan sürümün ne olduğunu tahmin etmek zorunda olduğunuz için bu sorunu çözmek zordur.

Yeni bir bağımlılık eklemek istiyorsanız, yine de çalışırsınız npm install {dependency}. Eğer yükseltme ya kullanmak istiyorsanız npm update {dependency}veya npm install ${dependendency}@{version}ve taahhüt değişti package-lock.json.

Bir yükseltme başarısız olursa, bilinen son çalışmaya geri dönebilirsiniz package-lock.json.


Npm doc teklifi yapmak için :

Oluşturulan paket kilidini kaynak kontrolüne almanız önemle tavsiye edilir: bu, ekibinizdeki diğer kişilerin, dağıtımlarınız, CI / sürekli entegrasyonunuz ve paket kaynağınızda npm kurulumunu çalıştıran herkesin aynı bağımlılık ağacını almasına izin verecektir. geliştiriyorsunuz. Ayrıca, bu değişikliklerin farkları insan tarafından okunabilir ve npm'in düğüm_modüllerinizde yaptığı değişiklikleri size bildirir, böylece herhangi bir geçişli bağımlılığın güncellendiğini, kaldırıldığını vb.

Ve vs arasındaki farknpm cinpm install açısından :

  • Projenin mevcut bir package-lock.json veya npm-shrinkwrap.json dosyası olmalıdır.
  • Paket kilidindeki bağımlılıklar package.json ile eşleşmiyorsa npm ci, paket kilidini güncellemek yerine bir hata ile çıkar.
  • npm ci bir kerede yalnızca tüm projeleri yükleyebilir: bu komutla bağımsız bağımlılıklar eklenemez.
  • A node_moduleszaten varsa npm ci, yüklemeye başlamadan önce otomatik olarak kaldırılır .
  • Asla package.jsonpaket kilitlerine veya herhangi bir pakete yazmaz : yüklemeler esasen dondurulur.

Not: Burada benzer bir cevap gönderdim


10
Bu cevap özellikle npm ci kullanarak daha fazla krediyi hak ediyor. Bu, insanların paket kilidi ile yaşadıkları sorunların çoğunu azaltır.
JamesB

Ben çok daha temiz bir seçenek olarak package.json (caret veya tilde) sabit sürümü kullanarak buldum. Bu beni bir whose build would fail one day because a random dependency got a breaking updatetür sorundan kurtarıyor . Her ne kadar çocuğun aynı konuya bağımlılık olasılığını bırakmasına rağmen.
Ashwani Agarwal

58

Evet, en iyi uygulama check-in yapmaktır (EVET, CHECK-IN)

Farkı gördüğünüzde çok fazla gürültü veya çatışmaya neden olacağını kabul ediyorum. Ancak faydaları:

  1. Her paketin aynı sürümünü garanti eder . Bu bölüm, farklı zamanlarda farklı ortamlarda inşa ederken en önemlisidir. Sen kullanabilir ^1.2.3Gözlerinde farklı package.json, ama nasıl u her zaman sağlayabilirsiniz npm install, senin dev makine ve yapı sunucusunda özellikle dolaylı bağımlılık paketlerini aynı sürümünü alacak? Peki, package-lock.jsonbunu sağlayacak. ( npm ciHangi kilit dosyası dayalı paketleri yükleyen yardımıyla )
  2. kurulum sürecini geliştirir.
  3. yeni denetim özelliği ile yardımcı olur npm audit fix(Bence denetim özelliği npm sürüm 6'dan geliyor).

3
Bildiğim kadarıyla, asla semver (npm devs zaten anlamıyor) kullanmak, en az% 99 vakada bir kilit dosyasına sahip olmakla aynı davranışı sağlamalıdır. Benim kendi deneyimim semver fuckups çoğunlukla birincil paketleri (doğrudan bağımlılıklar, bok jquery datepickers, vb.) İle gerçekleşir. Npm ile benim kişisel deneyim kilit dosyaları sonsuza kadar gürültü olduğunu olmuştur. Umarım bu bilgelik son sürümlerle değişmez.
Svend

13
Bahsetmek için +1 npm ci. İnsanlar genellikle a'nın package-lock.jsonpaketlerin deterministik bir kurulumuna izin verdiğini söylerler, ancak neredeyse bu davranışı kolaylaştıran komuttan asla bahsetmezler! Birçok kişi muhtemelen npm installkilit dosyasında tam olarak ne olduğunu yanlış yükler ...
ahaurat

npm ci npm 5 değil.
dpurrington

Teşekkür ederim! Eğer sadece package-lock.json komutunu kullanmak mantıklıdır npm ci. Ekibiniz / lider geliştiriciniz ne zaman güncelleneceğini belirleyebilir. Eğer herkes keyfi olarak işliyorsa, bunun bir anlamı yok ve sadece deponuzda gürültü yaratıyor. NPM belgeleri bunu daha açık hale getirmelidir. Bence çoğu geliştirici sadece bu özellik ile karıştırılıyor.
adampasz

@adampasz aslında her geliştirici kilit dosyasını işleyebilir ve bir kez testi geçip birleştirildiğinde, ikinci şube sadece bir şekilde paketler değişirse kilit dosyasını yeniler (paketi değiştirmeziz. json, bu sorunla daha az karşılaşırız (
Xin

38

Bu dosyayı projelerimde taahhüt etmiyorum. Amaç ne ?

  1. Üretildi
  2. Gitlab-ci.yml yapıları ile gitlab'de bir SHA1 kod bütünlüğü hatalarının nedeni budur

Her ne kadar benim paketimde asla ^ kullanmıyorum doğru olsa da.


11
Keşke bu npm dokümanlar içinde daha fazla açıklanabilseydi - taahhütte bulunmadan özellikle kaybettiğiniz şeyin bir taslağına sahip olmak yararlı olacaktır package-lock.json. Bazı depolar, sahip olmanın getirdiği avantajları gerektirmeyebilir ve kaynakta otomatik olarak oluşturulmuş içeriğin bulunmamasını tercih edebilir.
PotatoFarmer

2
Sorunları çözmeye yardımcı olmak için hata ayıklama (örneğin iki kilit arasında bir fark) için nasıl yararlı olabileceğini görebilirsiniz. Sanırım bu tür şeyleri önlemek için de kullanılabilir, ancak ortak bir repoda olması nedeniyle birleşme çatışmaları yaşayabileceği bir acı da olabilir. Yeni başlayanlar için işleri basit tutmak istiyorum, package-lock.json'a gerçek bir ihtiyaç olduğunu görene kadar package.json'u tek başına kullanacağım.
radtek

6
^ Paketinizde.json kullanamazsınız, ancak bağımlılıklarınızın kullanmadığından emin olabilir misiniz?
neiker

35

Git farkını yaparken gürültüden şikayetçi olan kişilere:

git diff -- . ':(exclude)*package-lock.json' -- . ':(exclude)*yarn.lock'

Yaptığım bir takma ad kullanmaktı:

alias gd="git diff --ignore-all-space --ignore-space-at-eol --ignore-space-change --ignore-blank-lines -- . ':(exclude)*package-lock.json' -- . ':(exclude)*yarn.lock'"

Package-lock.json dosyasını tüm havuz için diffs cinsinden (bunu kullanan herkes) yok saymak için, bunu aşağıdakilere ekleyebilirsiniz .gitattributes:

package-lock.json binary
yarn.lock binary

Bu durum, "ikili kilit dosyaları a / package-lock.json ve b / package-lock.json dosyalarını paket kilit dosyası her değiştiğinde farklılık gösterir. Buna ek olarak, bazı Git hizmetleri (özellikle GitLab değil, GitHub değil) Bu dosyaları (daha fazla 10k satır değişti!) diffs'den çevrimiçi yaparken bunu yaparken


1
gd() { git diff --color-words $1 $2 -- :!/yarn.lock :!/package-lock.json; }Bir takma ad yerine .bashrc dosyamda var .
apostl3pol

16

Evet, bu dosyayı teslim edebilirsiniz. Gönderen UÖM'nin resmi dokümanlar :

package-lock.json, veya ağacını npmdeğiştiren 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.node_modulespackage.json

Bu dosya kaynak havuzlarına ayrılmak üzere tasarlanmıştır [.]


13
Bir yükleme her zaman node_modules'i güncelleştirmez ve bu nedenle package-lock.json dosyasını güncellemez mi?
Tim Gautier

2
Hayır, npm cipaket-lock.json'dan kurulum için koşabilirsiniz
William Hampshire

Yanıtınızda paket-lock.json varsa sürekli entegrasyon derlemenizde npm ci kullanmanız gerektiğini vurgulamanız gerekir
MagicLAMP

6

Package-lock.json dosyasını genel olarak devre dışı bırak

terminalinize aşağıdakileri yazın:

npm config set package-lock false

bu benim için sihir gibi çalışıyor


2
Bu ~/.npmrciçerikle (en azından benim macos'umda) oluşturur package-lock=falseve aynı şey herhangi bir projede yapılabilir node_modules/(örneğinecho 'package-lock=false' >> .npmrc
jimmont

6
Bunun olumsuz olması bana komik geliyor. npm topluluğu bu package-lock.json otomatik neslinin topluluk katılımının kötü olduğunu kabul edemez. bir ekip sürecini etkileyebilecek şeyler yapmamalısınız. zorunlu kılmak için bir seçenek olmalıydı. kaç kişi sadece "git add *" yapar ve hatta fark ve yapıları berbat değil. Herhangi bir birleştirme tabanlı akış varsa, git akışını kullanan insanlar için bir İncil gibi biliyorum, bu işe yaramaz. birleştirme üzerine nesil olamaz! npm sürüm bozuk, paket: 1.0.0 deterministik olmalı!
Eric Twilegar

3
bu niçin oysuz? bu, çalışmayan bir özelliği devre dışı bırakmanın yasal bir yoludur. Ve soruyu kendi başına cevaplamasa da, soruyu tartışıyor. yani artık cevaplamaya gerek yok. Thumbs up from me :)
Superole

İndirilmemesinin nedeni, bir özelliği devre dışı bırakmanızdır.
Raza

5

Evet, package-lock yapmak standart bir uygulamadır.

Package-lock.json işleminin temel nedeni, projedeki herkesin aynı paket sürümünde olmasıdır.

Artıları: -

  • Sıkı sürümleri takip ederseniz ve üçüncü sürüm paketlerinde paket kilidi uygulayan geriye dönük uyumsuz değişikliklerden kendinizi kurtarmak için büyük sürümlerin otomatik olarak güncellenmesine izin vermiyorsanız çok yardımcı olur.
  • Belirli bir paketi güncelleştirirseniz, package-lock.json dosyasında güncellenir ve depoyu kullanan herkes değişikliklerinizi çektiğinde söz konusu sürüme güncellenir.

Eksileri:-

  • Çekme taleplerinizi çirkin gösterebilir :) '

Düzenleme: - npm install projedeki herkesin aynı paket sürümünde olduğundan emin olmayacaktır. npm ci bu konuda yardımcı olacaktır.


4
Bunun npm ciyerine kullanmak isterseniz eksilerini gider npm install.
k0pernikus


1
"Projedeki herkes aynı paket versiyonunda olacak, tek yapmanız gereken npm install" Doğru değil, bunun yerine "npm ci" kullanmanız gerekiyor
reggaeguitar

Teşekkürler, @reggaeguitar. Bunun için cevabım güncelleniyor.
Nikhil Mohadikar

2

Benim npm kullanımı minimize / uglified css / js oluşturmak ve bir django uygulaması tarafından sunulan sayfalarda gerekli javascript oluşturmaktır. Uygulamalarımda, Javascript animasyonlar oluşturmak için sayfada çalışır, bazen ajax aramaları yapar, bir VUE çerçevesi içinde çalışır ve / veya css ile çalışır. Package-lock.json dosyasının package.json dosyasındaki bazı geçersiz kılma denetimleri varsa, bu dosyanın bir sürümü olması gerekebilir. Deneyimlerime göre ya npm install tarafından neyin yüklendiğini etkilemez ya da eğer öyleyse, benim bilgime dağıttığım uygulamaları olumsuz etkilememiştir. Mongodb veya geleneksel olarak ince istemci olan diğer uygulamaları kullanmıyorum.

Npm install bu dosyayı oluşturduğundan ve npm install uygulamayı çalıştıran her sunucuda konuşlandırma işleminin bir parçası olduğu için package-lock.json dosyasını repo'dan kaldırırım. Düğüm ve npm sürüm kontrolü her sunucuda elle yapılır, ancak bunların aynı olmasına dikkat ediyorum.

Ne zaman npm installsunucu üzerinde çalıştırılır, yani paket-lock.json değiştirir ve sunucudaki repo tarafından kaydedilen bir dosyada değişiklik varsa, bir sonraki dağıtma sen kökenli yeni değişiklikler çıkarmak için izin alışkanlık. Çekme paketi-lock.json üzerinde yapılan değişikliklerin üzerine yazacağı için konuşlayamazsınız.

Paket-lock.json paketin içeriğini yansıtmıyorsa, npm bir komut verdiğinizde npm'den şikayet edeceğinden, yerel olarak oluşturulan bir paket-lock.json'un repoda bulunanlarla (sabit kaynak yöneticisini sıfırla) üzerine yazamazsınız. npm kurulumundan dolayı node_modules, böylece konuşlandırmayı bozar. Şimdi bu node_modules'e biraz farklı sürümlerin kurulduğunu gösteriyorsa, bu bana bir daha asla sorun yaratmadı.

Node_modules deponuzda değilse (ve olmamalıdır), package-lock.json yoksayılmalıdır.

Bir şey eksiksem, lütfen yorumlarda beni düzeltin, ancak sürümlendirmenin bu dosyadan alındığı nokta mantıklı değil. Package.json dosyasında sürüm numaraları vardır ve bu dosyanın npm yüklemesi oluştuğunda paketleri oluşturmak için kullanılan dosya olduğunu varsayıyorum, kaldırdığımda npm yüklemesi aşağıdaki gibi şikayet ediyor:

jason@localhost:introcart_wagtail$ rm package.json
jason@localhost:introcart_wagtail$ npm install
npm WARN saveError ENOENT: no such file or directory, open '/home/jason/webapps/introcart_devtools/introcart_wagtail/package.json'

ancak yapı başarısız olur, ancak node_modules yüklenirken veya js / css oluşturmak için npm uygulanırken package-lock.json kaldırılırsa herhangi bir şikayet yapılmaz

jason@localhost:introcart_wagtail$ rm package-lock.json 
jason@localhost:introcart_wagtail$ npm run dev

> introcart@1.0.0 dev /home/jason/webapps/introcart_devtools/introcart_wagtail
> NODE_ENV=development webpack --progress --colors --watch --mode=development

 10% building 0/1 modules 1 active ...

Sadece eklemek için, şimdi paket-lock.json'umu depomda taahhüt ettim ve silme düğümü_modüllerine inandığım ve güncellemeden package-lock.json'daki her şeyi yüklediğime inanıyorum. Bu benim ön uç adam dağıtım manüel müdahale gerek kalmadan javascript şeyler yükseltme sağlar.
MagicLAMP
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.