Node.js (package.json) için “devDependencies” NPM modüllerinin yüklenmesini nasıl önlersiniz?


587

Bu benim package.json dosyamda (kısaltılmış sürüm) var:

{
  "name": "a-module",
  "version": "0.0.1",
  "dependencies": {
    "coffee-script":      ">= 1.1.3"
  },
  "devDependencies": {
    "stylus":             ">= 0.17.0"
  }
}

Mac 10.6.8'de NPM sürüm 1.1.1 kullanıyorum.

Proje kökünden aşağıdaki komutu çalıştırdığınızda, hem dependencies ve hem de yükler devDependencies:

npm install

Bu komutun yüklendiği izlenimindeydim devDependencies:

npm install --dev

Nasıl bu kadar yapabilirim npm installsadece yükler dependencies, (üretim ortamı sadece bu modülleri alır böylece) ise böyle bir şey npm install --devyüklemeler hem dependenciesve devDependencies?


1
Dokümana göre, haklısın, --dev geliştiricileri yükler, aksi takdirde sadece depsleri kurar. npmjs.org/doc/json.html . En azından adlandırılmış paketler için işe yaradığını biliyorum.
mna

1
2015 yılında bu Soru ile karşılaşırsanız, --save-dev anahtarı bu soruda sorulduğu gibi hile yapar.
Anand

1
Bu cevap stackoverflow.com/a/22004559/3718119 , her biri arasındaki dependenciesve arasındaki farklar hakkında güzel bir açıklama verir devDependencies.
quasoft

Yanıtlar:


844

npm installKomut kuracak devDependenciesdiğer boyunca dependenciesbir geliştirme ortamı (varsayılan), bir paket dizin içinde çalıştırdığınızda.

Kullanım npm install --only=prod(veya --only=production) yüklemek için sadece dependencies değil, devDependencies,ne olursa olsun değerinin NODE_ENVortam değişkeni.

Kaynak: npm belgeleri

Not: npm'nin (2015-08-13) v3.3.0'sından önce seçenek çağrıldı --production, yani npm install --production.


2
Agate'in mantığı muhtemelen devDependencies kaldırmaktır, böylece paketinizi yükleyen tüketicilerin npm install yourpackage.tgzde devDependencies almazlar. Ancak, durum zaten böyledir. Aşağıdaki Kevin Cox'un cevabına bakınız ( stackoverflow.com/a/15826602/825588 ).
Johann

5
npmjs.org/doc/cli/npm-install.html "Varsayılan olarak, npm install bağımlılık olarak listelenen tüm modülleri yükleyecektir. --production bayrağı ile npm devDependencies'te listelenen modülleri yüklemez."
tomByrer

14
Aman Tanrım. Tamamen NODE_ENV=productionyaptığım başka bir şeyden geçtim ve hayatım boyunca neden npm installbağımlılıklar kurmayacağımı anlayamadım. Kapsamlı cevap için teşekkürler.
aendrew

1
npm install --dev sadece bağımlılıkları
yüklerdi

10
Npm 3.3 ve sonrası için: npm WARN install --devSeçeneğin kullanımı kullanımdan kaldırılmıştır. --only=devBunun yerine kullanın .
srcspider

232

Ben de bu problemle karşılaşıyorum! npm install biraz kafa karıştırıcı ve web yayınları sanki açık bir 'geliştirme' kurulum modu varmış gibi -d / - dev bayraklarını getirmeye devam ediyor.

  • npm installhem " bağımlılıkları " hem de " devDependencies " i yükleyecek

  • npm install --productionsadece " bağımlılıklar " kuracak

  • npm install --devyalnızca " devDependencies " yükleyecek


29
UYARI: NODE_ENVolarak ayarlanırsa productionve çalıştırırsanız npm installdev bağımlılıkları yüklenmez. Dockerfile dosyamda bu sorunla karşılaştım.
vaughan

1
@vaughan Ben de bununla karşılaştım, npm --production=false install(bu --dev bayrağının yanında çalışıp çalışmayacağından emin olmasa da) koşarak çözülebilir
Bavell

138

Yeni seçenek:

npm install --only=prod

Yalnızca devDependencies yüklemek istiyorsanız:

npm install --only=dev

1
Bu sorunun tam tersini yanıtlar. OP, devDependencies'in nasıl yüklenmeyeceğini soruyor.
musicin3d

2
@ musicin3d'de kısmen doğrusınız, bu yüzden ilk kısımda sadece eşya bağımlılıklarının nasıl kurulacağını ve ikinci kısımda dev sadece bağımlılıkların nasıl kurulacağını cevapladım.
Cloxure

5
Selam. @ User1614572 hakkında bölümü eklemeden önce bu yorumu bıraktım --only=prod. Siz, efendim, kısmen haklısınız. ; P
musicin3d

dağıtım için ayrı bir bağımlılık ekleyebilir miyiz?
Jeeva Jsb

1
Bu bir yorum, cevap değil. Tüm yorumlarımı periyodik olarak kontrol etmiyorum. İnsanların yıllar önce yorumları güncellediklerini hiç görmedim . Buraya yorumuma bir yıl koyduğumu eleştirmek için buraya geldin. Daha fazla cevap vermeyeceğim. Diğer insanları trolling eğlenin.
Jacques ジ ャ ッ ク

47

Bu POST'u 2016 yılında okuduysanız, lütfen istediğinizi kullanarak

--only={prod[uction]|dev[elopment]} 

bağımsız değişken, NODE_ENV'den bağımsız olarak yalnızca devDependencies veya yalnızca devDependencies olmayan kuruluşların yüklenmesine neden olur.

from: https://docs.npmjs.com/cli/install


Neden "POST" yazılmalı? docs.npmjs.com/cli/install açıkça BOTH --productionve --only={prod[uction]|dev[elopment]}.
Dan Dascalescu

33

Tüm bağımlılıklarınızı zaten yüklediyseniz ve üretim paketlerinizi NPM'den tekrar indirmek zorunda kalmak istemiyorsanız, şunları yazabilirsiniz:

npm prune --production

Bu işlem, dev bağımlılıklarınızı node_modulesklasörünüzden kaldıracaktır ; bu, iki adımlı bir işlemi otomatikleştirmeye çalışıyorsanız

  1. Geliştirme bağımlılıklarını kullanarak projemi web paketle
  2. Yalnızca üretim modüllerini kullanarak bir Docker görüntüsü oluşturun

npm pruneArasında koşmak , her şeyi yeniden yüklemek zorunda kalmazsınız!


19

"Npm install" kullanıldığında modüller, "devDependencies" veya "bağımlılıklar" olup olmadıklarına bakılmaksızın uygulamanız boyunca yüklenir ve kullanılabilir. Bu fikrin toplamı: package.json'unuzun bağımlılık (herhangi bir tür) olarak tanımladığı her şey node_modules'e kurulur.

Bağımlılıklar / devDependencies / isteğe bağlıDependencies arasındaki farkın amacı, kodunuzun tüketicilerinin bu kaynakları yüklemek için w / npm ile neler yapabileceğidir.

Belgelere göre: https://npmjs.org/doc/json.html ...

Birisi modülünüzü programında indirmeyi ve kullanmayı planlıyorsa, muhtemelen kullandığınız harici test veya dokümantasyon çerçevesini indirmek ve oluşturmak istemez veya gerekmez.

Bu durumda, bu ek öğeleri bir devDependencies karma değerinde listelemek en iyisidir.

Bu şeyler --dev yapılandırma bayrağı her ayarlandığında yüklenir. Bu bayrak npm bağlantısı yapılırken veya bir paketin kökünden npm kurulumu yapılırken otomatik olarak ayarlanır ve diğer herhangi bir npm yapılandırma parametresi gibi yönetilebilir. Konu hakkında daha fazla bilgi için config (1) 'e bakınız.

Ancak, bu soruyu çözmek için YALNIZCA npm kullanarak "bağımlılıkları" yüklemek istiyorsanız, aşağıdaki komut şöyledir:

npm install --production

Bu, bu filtreyi ekleyen Git taahhüdüne (bu işlevselliği sağlamak için [aşağıda listelenen diğer bazı filtrelerle [aşağıda listelenmiştir) bakılarak) doğrulanabilir.

Npm tarafından kullanılabilecek alternatif filtreler:

--save          => updates dependencies entries in the {{{json}}} file
--force         => force fetching remote entries if they exist on disk 
--force-latest  => force latest version on conflict
--production    => do NOT install project devDependencies
--no-color      => do not print colors

@ dmarr npm install kullanmayı deneyin - üretim


16

npm, bir paketin içinden yüklerken dev bağımlılıklarını kuracaktır ( package.jsongeçerli dizinde bir varsa). Başka bir konumdan (npm kayıt defteri, git repo, dosya sistemindeki farklı konum) yalnızca bağımlılıkları yükler.


Lütfen yeniden formüle edebilir misiniz? Sanırım parantezinizde bir hata yaptınız, sanırım daha önce kapatmayı unuttunuz ve ifadeniz benim için çok anlamlı değil (anadili İngilizce olmayan). Johann'ın Rohan Singh cevabı altındaki yorumu, cevabınıza bakmamı işaret etti (çünkü şüphem akik şüphesi ile aynıydı) ve başarı yok. Hala npm install some-moduledev bağımlılıklarını nasıl kurmayacağımı anlamıyorum some-module.
Rafael Eyng

Teşekkürler, düzeltildi. Ancak sorunuzun geri kalanını anlamıyorum.
Kevin Cox

3

Düğüm eklentisi içeren bir paket için dev bağımlılıklarını yüklemeye çalışırken, sadece devDependencies'i yüklemek isteseniz bile npm install --dev'i çalıştırırken addon'u inşa etmekten kaçınamayacağınızı gördüm. Yani, npm geri dönmek zorunda kaldı:

node -e 'console.log( Object.keys( require( "./package.json" ).devDependencies ) );' | \
sed  -e "s/^[^']*'//" -e "s/'.*$//" | \
xargs npm install

Veya, daha iyi (ve daha özlü olarak),

node -e 'Object.keys( require( "./package.json" ).devDependencies )
.map( function( item ){ console.log( item ) } );' | xargs npm install

3

Kullan npm install packageName --savepaketi katacak bu bağımlılıkları kullanırsanız, npm install packageName --save-devo zaman devDependencies .

npm install packageName --save-devgeliştirme amaçlı paketler eklemek için kullanılmalıdır. TDD paketleri eklemek gibi (Chai, mocha, vb.). Üretimde değil gelişimde kullanılır.


OP'nin bağımlılıkları kaydetme konusunda bir sorunu yok, package.jsonancak bu bağımlılıklar zaten kaydedildikten sonra, npmyalnızca belirli bir bağımlılık türünü yükleme zorlaması . Cevabınızı burada okuduğumda, OP'nin yarattığı sorunu çözmeye yardımcı olacak hiçbir şey öğrenmedim.
Louis

3

NODE_ENVAynı sonucu elde etmek için ortam değişkenini kullanabileceğinizi belirtmek gerekir . Düğüm uygulamanızı (ör. Docker) kaplarsanız özellikle kullanışlıdır.

NODE_ENV=production npm install

Yukarıdaki kod, dev bağımlılıkları (dev devDependencies) hariç tüm bağımlılıklarınızı yükleyecektir .

ortam değişkenlerini kullanmanız gerekirse Dockerfiledaha fazla bilgiye buradan ulaşabilirsiniz .

Ortam değişkenlerinin üzerine gerektiğinde üzerine yazmak kolaydır (örneğin test paketinizi çalıştırmak istiyorsanız, örneğin Travis CI üzerinde). Eğer durum buysa, böyle bir şey yapabilirsiniz:

docker run -v $(pwd):/usr/src/app --rm -it -e NODE_ENV=production node:8 npm install

NPM Belgeleri burada

üretim

  • Varsayılan: yanlış
  • Tür: Boolean "Üretim" modunda çalıştırmak için true olarak ayarlayın.

    1. devDependencies, herhangi bir argüman olmadan yerel npm kurulumu çalıştırılırken en üst düzeyde kurulmaz.
    2. Yaşam döngüsü komut dosyaları için NODE_ENV = "üretim" değerini ayarlayın.

Mutlu konteynerizasyon =)


3

Ben kullanmanızı öneririm npm ci. Yalnızca üretime ihtiyaç duyulan paketleri (yazdığınız gibi - olmadan devDependencies) yüklemek istiyorsanız :

npm ci --only=production

veya

NODE_ENV=production npm ci

Eğer eski okulu tercih ediyorsanız npm install:

npm install --production

veya

NODE_ENV=production npm install

İşte neden kullanmanız gerektiği konusunda iyi bir yanıtnpm ci .


Harika, npm cisadece de değil, de işe yarıyor npm install!
Klesun

2

Seçilen cevaba eklemeniz gerekiyor: Şimdilik, npm installbir paket dizininde (içeren package.json) devDependencies yükleyecek, oysa npm install -gbunları yüklemeyecek.


7
Evet, -gyüklenmez devDependencies, ancak paketleri global olarak yükler, bu genellikle amaçlanan sonuç değildir.
Bardi Harborow

0

npm install --productionüretim için gerekli olan düğüm modüllerini kurmanın doğru yoludur. Daha fazla ayrıntı için belgelere bakın


-1

Şimdi bir sorun var, paket-lock.json npm 5+ ile varsa. Kullanmadan önce çıkarmanız gerekir npm install --production.


-1
npm install --dev will install dev dependencies

Ve sadece bağımlılıkları yüklemek için soruya göre, aşağıdaki komut yardımcı olacaktır

npm install --prod will install dependencies
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.