“Npm install” ve “npm ci” arasındaki fark nedir?


215

Sürekli entegrasyonla çalışıyorum ve npm ci komutunu .

İş akışım için bu komutu kullanmanın avantajlarının ne olduğunu anlayamıyorum.

Daha hızlı mı? Testi daha zor, daha iyi ve sonra yapar mı?

Yanıtlar:


328

Gönderen npm docs :

Kısacası, npm install ve npm ci kullanımı arasındaki temel farklar şunlardır:

  • Projenin mevcut bir package-lock.json veya npm-shrinkwrap.json dosyası olmalıdır.
  • Paket kilidindeki bağımlılıklar package.json ile aynı değilse, npm ci paket kilidini güncellemek yerine bir hata ile çıkar.
  • npm ci bir kerede tüm projeleri yükleyebilir: bu komutla bağımsız bağımlılıklar eklenemez.
  • Bir node_modules zaten varsa, npm ci kurulumuna başlamadan önce otomatik olarak kaldırılacaktır.
  • Asla package.json veya paket kilitlerinden birine yazmaz: yüklemeler esasen dondurulur.

Temel olarak, bir bağımlılıklar listesi oluşturmak için npm installokur package.jsonve package-lock.jsonbu bağımlılıkların hangi sürümlerinin yükleneceğini bildirmek için kullanır . İçinde bir bağımlılık yoksa package-lock.jsonbuna eklenirnpm install .

npm ci( C sürekli olmayan giriş işleminden sonra adlandırılır ), bağımlılıkları doğrudan yükler package-lock.jsonve package.jsonyalnızca eşleşmeyen sürümlerin olmadığını doğrulamak için kullanır . Herhangi bir bağımlılık eksikse veya uyumsuz sürümleri varsa, hata verir .

npm installYeni bağımlılıklar eklemek ve bir projedeki bağımlılıkları güncellemek için kullanın . Genellikle, bağımlılık listesini güncelleyen değişiklikleri çektikten sonra geliştirme sırasında kullanırsınız, ancak kullanmak iyi bir fikir olabilir.npm ci bu durumda .

npm ciDeterministik, tekrarlanabilir bir yapıya ihtiyacınız varsa kullanın . Örneğin sürekli entegrasyon, otomatik işler vb. Sırasında ve bağımlılıkları ilk kez kurarken npm install.

npm install

  • Bir paket ve tüm bağımlılıklarını yükler.
  • Bağımlılıklar npm-shrinkwrap.jsonvepackage-lock.json (bu sırayla) yönlendirilir.
  • bağımsız değişkenler olmadan : yerel bir modülün bağımlılıklarını yükler.
  • Global paketleri kurabilir.
  • İçindeki eksik bağımlılıkları yükler node_modules.
  • package.jsonVeya 'a yazabilir package-lock.json.
    • Bir argüman ( npm i packagename) ile kullanıldığında,package.json bağımlılığı eklemek veya güncellemek için .
    • bağımsız değişkenler olmadan kullanıldığında, ( npm i) package-lock.jsonbu dosyada bulunmuyorlarsa bazı bağımlılıkların sürümünü kilitlemek için yazılabilir .

npm ci

  • En az npm v5.7.1 gerektirir .
  • Gerektirir package-lock.jsonveyanpm-shrinkwrap.json mevcut olmak.
  • Bu iki dosyadan gelen bağımlılıklar eşleşmezse bir hata atar package.json .
  • Tüm bağımlılıkları kaldırır node_modulesve kurar kerede .
  • Asla yazmaz package.jsonya da package-lock.json.

Algoritma

İken npm cikadar tüm bağımlılık ağacını oluşturur package-lock.jsonya npm-shrinkwrap.json, npm install içeriğini güncellemektedirnode_modules şu algoritmasını (kullanarak kaynak ):

load the existing node_modules tree from disk
clone the tree
fetch the package.json and assorted metadata and add it to the clone
walk the clone and add any missing dependencies
  dependencies will be added as close to the top as is possible
  without breaking any other modules
compare the original tree with the cloned tree and make a list of
actions to take to convert one to the other
execute all of the actions, deepest first
  kinds of actions are install, update, remove and move

1
npm installPackage.json'a yazabileceğimi bilmiyordum . Burada ne yazabileceğini biliyor musun?
Veve

5
bu biraz yanıltıcı olabilir ... bağımlılıkları yüklemek, güncellemek veya kaldırmak için kullandığınızda package.json yazacaktır. Metinde bunu daha açık hale getireceğim, teşekkürler!
lucascaro

Bu algoritma nerede belgeleniyor? Yani kaynağın ne?
Yngvar Kristiansen

1
@YngvarKristiansen npm belgelerinde, referans için belirli bir bölüme bir bağlantı ekledi
lucascaro

4
npm install packageHer iki değiştirebilir package-lock.json ve package.json süre npm installwhithout argümanlar sadece değişiklik yapacağıpackage-lock.json
knobo

20

npm civarolan herhangi bir node_modules klasörünü siler ve package-lock.jsonher paketin belirli bir sürümünü yüklemek için dosyaya güvenir . Bazı özellikleri atladığı için npm kurulumundan çok daha hızlıdır. Temiz devlet kurulumu ci / cd boru hatları ve liman işçileri için harika! Ayrıca, belirli paketleri değil, her şeyi bir kerede yüklemek için kullanırsınız.


9

Bağladığınız belgelerin özeti vardı:

Kısacası, npm install ve npm ci kullanımı arasındaki temel farklar şunlardır:

  • Projenin mevcut bir package-lock.json veya npm-shrinkwrap.json dosyası olmalıdır.
  • Paket kilidindeki bağımlılıklar package.json ile aynı değilse, npm ci paket kilidini güncellemek yerine bir hata ile çıkar.
  • npm ci bir kerede tüm projeleri yükleyebilir: bu komutla bağımsız bağımlılıklar eklenemez.
  • Bir node_modules zaten varsa, npm ci kurulumuna başlamadan önce otomatik olarak kaldırılacaktır.
  • Asla package.json veya paket kilitlerinden birine yazmaz: yüklemeler esasen dondurulur.

2

Komutlar işlevsellik açısından çok benzerdir, ancak fark, dosyalarınızda package.jsonve package-lock.jsondosyalarınızda belirtilen bağımlılıkları yüklemek için alınan yaklaşımdadır .

npm ci uygulamanızın tüm bağımlılıklarının temiz bir yüklemesini gerçekleştirir npm install sistemde zaten mevcutsa bazı yüklemeleri atlayabilir. Sistemde zaten kurulu olan sürüm package.json, kurmayı amaçladığınız sürüm değilse, yani kurulu sürüm ' gerekli ' sürümden farklıysa bir sorun ortaya çıkabilir .

Diğer farklılıklar npm cipackage*.json dosyalarınıza asla dokunmaz . Yükleme durur ve bağımlılık sürümleri package.jsonve package-lock.jsondosyalarında eşleşmezse bir hata gösterir .

Burada resmi dokümanlardan çok daha iyi bir açıklama okuyabilirsiniz .

Ayrıca, burada paket kilitleri hakkında bilgi almak isteyebilirsiniz .


1

Alp gibi ışık düğümü docker görüntülerinde, bağımlılığı node-gyptarafından kullanılan Python yüklü olmadığı unutulmamalıdır.npm ci .

Sanırım sahip olmak için biraz düşünülmüş npm ci için Python'u derlemenize bağımlılık olarak yüklemeniz gerektiğine .

Daha fazla bilgi burada Docker ve npm - gyp ERR! Tamam değil


0

Herkes teknik farklılıklara cevap verirken, hiçbiri her ikisini de hangi durumlarda kullanacağını açıklamaz.

Bunları farklı durumlarda kullanmalısınız.

npm installnode_modulesdizini önbelleğe almak istediğinizde geliştirme ve CI için mükemmeldir . Ne zaman kullanılır? Başkalarının kullanması için bir paket yapıyorsanız bunu yapabilirsiniz ( node_modulesböyle bir sürüme dahil ETMİYORSUNUZ) . Önbelleklemeyle ilgili olarak , çalışma zamanı gereksinimleri arasındaki farklar nedeniyle yeniden yüklenmesi gerekebilecek farklı Node.jshatırlama sürümlerini desteklemeyi planlıyorsanız dikkatli olun . Bir sürüme bağlı kalmak istiyorsanız, en son sürüme sadık kalın .node_modulesNode.jsLTS

npm ciBir üretim uygulamasını (diğer paketler tarafından kullanılmayacak bir son ürün) test etmek ve yayınlamak için kullanılmalıdır, çünkü kurulumun olabildiğince belirleyici olması önemlidir, bu kurulum daha uzun sürer, ancak sonuçta uygulamanız daha güvenilirdir ( node_modulesböyle bir sürüme dahil edersiniz ) . LTSSürümü ile sopa Node.js.

Bonus: Ne kadar karmaşık yapmak istediğinize bağlı olarak bunları karıştırabilirsiniz. İçindeki özellik dallarında , ekiplerinizin verimliliğini artırmak için gitönbellekleme yapabilir node_modulesve birleştirme isteği ve ana dallar npm cibelirleyici bir sonuç için güvenebilir .

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.