--Save ve --save-dev arasındaki fark nedir?


747

Arasındaki fark nedir:

npm install [package_name] --save

ve:

npm install [package_name] --save-dev

Ne anlama geliyor?


4
evet bu konuda kafam karıştı - Jenkins gibi sürekli entegrasyon kullanıyorsanız Jenkins testler için devDependencies modüllerini kullanmayı biliyor mu? Sanırım öyle ama çok açık değil.
Alexander Mills

5
belki de bağımlılıklar ve devDependencies arasındaki fonksiyonel fark nedir?
Alexander Mills

5
--Save-dev seçeneği ile kurulan paketler, kullanıcı yürütüldüğünde yeniden kurulmaz npm install --production. Bu operasyonel farktır ( daha fazla bilgi için bkz. Https://docs.npmjs.com/cli/install ).
Andrew

7
@MuhammadUmer Bu yüzden insanlar 'ipucu almak' için burada sorular soruyorlar. Belki de gerçek bir cevap eklemek daha verimli olurdu - bu kesinlikle farkında olmadığım ilginç bir ayrım.
Simon_Weaver

3
Ayrıca ortam değişkenini NODE_ENVüretime ayarlarsanız , npm installgeliştirme paketlerini otomatik olarak hariç tutar.
Muhammed Umer

Yanıtlar:


591
  • --save-devpaketi geliştirme amacıyla kaydetmek için kullanılır. Örnek: birim testleri, küçültme ..
  • --save uygulamanın çalışması için gereken paketi kaydetmek için kullanılır.

150
Nasıl farklılar? Birini diğerine ne zaman kullanabilirim? --Save-dev altındaysa paketi hala üretimde kullanabilir miyim?
Dave Voyles

14
Cevap ilk iki sorunuzu kısa ve öz bir şekilde cevaplıyor. Son sorunun cevabı, "Tasarruf-dev altında ise paketi hala üretimde kullanabilir miyim", "hayır" dır. Bunu yapmak kesinlikle mümkün olsa da , amaçlanmamıştır.
Technetium

61
Kestirme versiyonlar: -Dkısa --save-devve -Skısa--save
chrisco

164
Bu cevap sinir bozucu bir şekilde belirsiz. Küçük bir örnek bile, bunu daha net hale getirmeye yardımcı olmak için uzun bir yol kat edecektir.
Choylton B.Higginbottom

33
Npm sürüm 5.0.0'dan itibaren, --saveseçeneğin artık gerekli olmadığını unutmayın. Bunu yaparsanız npm install my-package, package.json dosyasına bağımlılık olarak "my-package" i ekleyecektir.
Martin Carel

642

İkisini de kendi projelerinizde denediyseniz --saveve arasındaki --save-devfark hemen fark edilmeyebilir. İşte birkaç örnek ...

Tarihleri ​​ayrıştırmak ve görüntülemek için an paketini kullanan bir uygulama oluşturduğunuzu varsayalım. Uygulamanız bir zamanlayıcıdır, bu nedenle çalışması için bu pakete gerçekten ihtiyacı vardır: onsuz çalışamaz . Bu durumda,

npm install moment --save

Bu paketinizde yeni bir değer yaratacaktır.

"dependencies": {
   ...
   "moment": "^2.17.1"
}

Geliştirirken, test süitleri gibi araçların kullanılmasına gerçekten yardımcı olur ve yasemin çekirdeği ve karma gerekebilir . Bu durumda,

npm install jasmine-core --save-dev
npm install karma --save-dev

Bu aynı zamanda paketinizde yeni bir değer yaratacaktır.

"devDependencies": {
    ...
    "jasmine-core": "^2.5.2",
    "karma": "^1.4.1",
}

Uygulamayı normal durumunda çalıştırmak için test paketine ihtiyacınız yoktur , bu nedenle bir --save-devtür bağımlılıktır, başka bir şey değildir. Gerçekten ne olduğunu anlamadıysanız, hayal etmek biraz zor olabilir.

Doğrudan NPM dokümanlarından alınmıştır # dokümanlar

Bağımlılıklar

Bağımlılıklar, bir paket adını sürüm aralığına eşleyen basit bir nesnede belirtilir. Sürüm aralığı, bir veya daha fazla boşlukla ayrılmış tanımlayıcıya sahip bir dizedir. Bağımlılıklar ayrıca bir tarball veya git URL'si ile tanımlanabilir.

Lütfen bağımlılık nesnenize test kayışlarını veya transpilleri koymayın. Aşağıdaki dev bağımlılıklara bakın.

Dokümanlarda bile, test kablo demetleri gibi modüller için --save-dev kullanmanızı ister.

Umarım bu yardımcı olur ve açıktır.


15
IMO, 'save' anahtar kelimesinin bir sorun olduğunu düşünüyorum. Neden geliştirmek için -dev bayrağı ve dağıtım için dağıtımı yapmıyorlar. 'Save' anahtar kelimesinden daha mantıklı.
Thinh Vu

1
Paket neden bir sürüm paketi mi yoksa bir geliştirici paketi mi olduğunu bilmiyor (karar veriyor) ve - her ikisi için de kullanılıyor. Paket geliştirici amacı oluşturduğunda, yükleme kullanıcısının buna karar vermesi garip görünüyor.
CodeGrue

4
CodeGrue, jQuery'yi yalnızca React bileşenlerini test etmek için kullanırsanız, save-dev'e gider, ancak aslında ana projenizi oluşturmak için kullanamazsınız. Evet, bu mümkün. Peki paketleyici neden onunla ne yaptığınızı biliyor?
Michael Bruce

2
Çok daha net. Bootstra + Node.js iş akışını ilk kez öğrenen gömülü bir adamım. Manşetteki farkın ne olduğu belli değil.
Leroy105

3
@YakovL save-dev, başka biri paketinizi bağımlılığı olarak yüklediğinde paketlerin yüklenmediği anlamına gelir. Bu durumda yalnızca başlatma / derleme gibi komut dosyalarını çalıştırmak için kullanılan paketlere gerek duyulmaz, bu nedenle geliştiricilere bağımlı hale getirilirler. Bir web uygulaması üzerinde çalışıyorsanız ve başkaları tarafından kullanılmak üzere bir paket üzerinde değilseniz, muhtemelen bu konuda endişelenmemelisiniz.
riv

111

Varsayılan olarak, NPM sadece node_modules altına bir paket kurar. Uygulamanız / modülünüz için bağımlılıklar yüklemeye çalıştığınızda, önce bunları yüklemeniz ve ardından dependenciesbölümünüze eklemeniz gerekir package.json.

--save-devüçüncü taraf paketi, paketin geliştirme bağımlılıklarına ekler. Birisi paketinizi yüklediğinde yüklenmez. Birisi eğer genellikle sadece yüklediği klonlarının kaynak depoyu ve ishal npm installiçinde.

--saveüçüncü taraf paketi paketin bağımlılıklarına ekler. Birisi her çalıştığında paketle birlikte kurulacaktır npm install package.

Geliştirici bağımlılıkları, yalnızca paketi geliştirmek için gereken bağımlılıklardır. Bu, test çalıştırıcılarını, derleyicileri, paketleyicileri vb. İçerebilir. Her iki bağımlılık da paketin package.jsondosyasında saklanır . --saveekler dependencies, --save-deveklerdevDependencies

npm kurulum belgelerine buradan ulaşılabilir.


37
Bundan şüpheliyim ... --save-dev ve --save dönüşümlü olarak kullanabilirsiniz, yani npm'den indirilen bir paket haline gelmeyecek bir web uygulaması oluşturuyorsanız, başkalarıyla paylaşmak için bir paket geliştiriyorsanız, farkı anlamak önemlidir.
VFein

13
Sonunda npm install kullandığınızda amacını söyleyen birine teşekkür ederim
CapturedTree

3
--save artık 2017'de npm 5'in yayınlanmasıyla npm kurulumu ile varsayılan
NattyC

Bekle, neden karmaşık cümleler? DevDependecy'de geliştirici paketleri kurabilir ve sadece devDevependency güncellenir. Yani yeni geliştirici proje kod temeli klonlamak ve npm install => burada sadece dependency package name is going to install.düğüm_modüllerde çalıştırmak .. Dev-bağımlılık gibi geliştirici paketinde değil.
Anupam Maurya

60

Buna mükemmel bir örnek:

$ npm install typescript --save-dev

Bu durumda, gelişmeye hazır bir Typcript (javascript-ayrıştırılabilir kodlama dili) olmasını istersiniz, ancak uygulama bir kez dağıtıldığında, kodun tamamı javascript'e aktarıldığı için artık gerekli değildir. Bu nedenle, yayınlanan uygulamaya dahil etmek mantıklı olmaz. Gerçekten de, sadece yer kaplar ve indirme sürelerini arttırır.


4
Aynı şey: geliştirme için yararlı olduğu için "$ npm install grunt --save-dev" için de geçerli, ancak dağıtım için değil.
Jackalope

1
Bir yan not: Microsoft / xxx paketleri bağımlılıklar, değil devDependencies olarak türlerine @ yükleme önerir github.com/Microsoft/types-publisher/issues/81
Dave

2
Kafa karıştırıcı bulduğum şey, bunun nasıl bir önemi var? Kullanılarak kaydedilen paketler --saveyine de yalnızca node_modulesklasöre kaydedilir . Kod, dağıtılan web sitesinde yer almıyor.
Kokodoko

6
@Kokodoko --save-devBayrağı kullandığınızda, paket devDependenciesnesnenize eklenir . Birisi yüklediğinde ise / senin paket, tüm dependenciesindirilir ama devDependenciesonlar zamanında gerekli değildir, çünkü değildir. Yanıtın belirttiği gibi, bu onlara zaman ve yer kazandırır. Paket dosyalarınız üzerinde çalışan geliştiriciler npm installde yüklemek için paket dizininin içinde çalışabilirler devDependencies.
Jasjit Singh Marwah

Github ve türünden bir repo indirmek Yani eğer npm install, devDependenciesgöz ardı edilir?
Kokodoko

41

Sana bir örnek vereyim,

  • Çok SERIOUS npm kütüphanesinin geliştiricisisiniz . Hangi paketi test etmek için farklı test kitaplıkları kullanır.
  • Bir kullanıcı kitaplığınızı indirdi ve kodunda kullanmak istiyor. Test kitaplıklarınızı da indirmeleri gerekiyor mu? Belki jesttest için kullanıyorsunuz ve kullanıyorlar mocha. Onların da yüklenmesini istiyor musunuz jest? Sadece kütüphanenizi çalıştırmak için mi?

Doğru değil? Bu yüzden içerideler devDependencies.

Birisi yaptığında, npm i yourPackageyalnızca kitaplığınızı ÇALIŞTIRMAK için gereken kitaplıklar yüklenir. Kodunuzu paketlemek veya test etmek ve alay etmek için kullandığınız diğer kütüphaneler, bunları koyduğunuz için yüklenmeyecektir devDependencies. Oldukça temiz değil mi?

Peki, neden geliştiricilerin devDependancies maruz göstermek gerekiyor ?

Diyelim ki paketiniz açık kaynaklı bir paket ve 100 kişi paketinize istek gönderiyor. Peki paketi nasıl test edecekler? They will git clonesenin repo ve onlar yapacağını zaman bağımlılıkları yanı sıra devDependencies . Çünkü paketinizi kullanmıyorlar. Paketi daha da geliştiriyorlar, bu nedenle paketinizi test etmek için mevcut test senaryolarını geçmeleri ve yeni yazmaları gerekiyor. Bu nedenle, kullandığınız tüm test / bina / alay kitaplıklarını kullanmanız gerekir.npm i
devDependencies


8
Bu cevap doğada daha pratik olduğu için, kabul edilen cevaptan ve maksimum oylarla cevaptan çok daha iyi. Teşekkürler!
Yakalanmayan İstisna

Seçilen cevap bu olmalıdır. Diğer tüm cevaplar neden birini diğerinin üzerinde kullanacağınızı açıklamıyor.
Rocky Kev

34

İçinde @ andreas-Hultgren önerdiği gibi bu cevap ve uygun npm docs :

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

Ancak, webapp geliştirmesi için Yeoman (hakemli, önceden yazılmış bir package.json dosyasını diğer şeylerin arasına yükleyen bir iskele aracı) tüm paketleri devDependencies'a yerleştirir ve bağımlılıklara hiçbir şey yerleştirmez, bu nedenle kullanımı --save-devgüvenli bir bahis gibi görünüyor içinde webapp geliştirme, en azından.


3
Yudum kullanırken ve --save-devpaketin gerekli bağımlılıklarını yüklemeyeceği paketler yüklerken sorunlarla karşılaştığımı unutmayın . Running, --saveeksik olan bağımlılıkları kurdu.
Nick M

18
Ayrıca, --savetest ve dokümantasyon bağımlılıkları (npm dokümanlar uyarınca) hariç tüm kullanıcılar için kullandığımı da belirtmek isterim. Yukarıda bahsettiğim Yeoman örneğinin en iyi uygulamalara iyi bir örnek olmadığını düşünmeye başlıyorum .
wayfarer_boy

Ben de öyle düşünüyorum, neden hiç ihtiyacınız olsun --save-devburada her cevap ile daha az
netleşiyor

20

--save-devsemver spec'i paket tanımlayıcı dosyanızdaki "devDependencies" dizisine --savekaydeder, bunun yerine "bağımlılıklar" a kaydeder.


83
ve fonksiyonel fark nedir?
ahnbizcad

6
bu cevap benim için en anlamlı, devDependencies daha sonra geliştirme için gerekli, ancak üretim için değil, bu yüzden htmllint, sass derleme vb ve Bağımlılıklar, şeylerin çalışması için mevcut olması gereken Diaporama gibi üretim gereksinimleri içindir.
Miller the Gorilla

3
@ahnbizcad Daha iyi cevap vermedi burada ancak birincil fonksiyonel fark devDependencies geçişli dahil değildir olmasıdır.
Hız

Bunu zaten bilmeyen biri için tanımlamanın en sezgisel yolu değil mi ?: Dev --save-dev, paketleri projeniz --saveiçin yerel, düğümünüzü yüklemeniz için yerel yapar mı?
ahnbizcad

9

Net cevaplar zaten verilmiştir. Ancak devDependenciespaketlerin yüklenmesini nasıl etkilediğini belirtmek gerekir :

Npm install varsayılan olarak package.json dosyasına bağımlılık olarak listelenen tüm modülleri yükleyecektir. --Production bayrağıyla (veya NODE_ENV ortam değişkeni üretime ayarlandığında), npm devDependencies içinde listelenen modülleri yüklemez.

Bkz. Https://docs.npmjs.com/cli/install


8

Genellikle üretim paketini sadece Geliştirme amacıyla kullanmayı planladığınız şeylerle şişirmek istemezsiniz.

Birim Testi çerçeveleri (jest, yasemin, mocha, chai vb.) Gibi paketleri ayırmak için --save-dev(veya -D) seçeneğini kullanın .

Uygulamanızın Üretim için ihtiyaç duyduğu diğer paketler --save(veya -S) kullanılarak kurulmalıdır .

npm install --save lodash       //prod dependency
npm install -S moment           // "       "
npm install -S opentracing      // "       "

npm install -D jest                 //dev only dependency
npm install --save-dev typescript   //dev only dependency

package.jsonDosyayı açarsanız, bu girişlerin iki farklı bölüm altında listelendiğini görürsünüz:

"dependencies": {
  "lodash": "4.x",
  "moment": "2.x",
  "opentracing": "^0.14.1"
},

"devDependencies": {
    "jest": "22.x",
    "typescript": "^2.8.3"
},

5

--save-dev , uygulamanın geliştirilmesinde kullanılan modüller için kullanılır, üretim ortamında çalıştırılmayı gerektirmez - save , package.json dosyasına eklemek için kullanılır ve uygulamanın çalışması için gereklidir.

Örnek: ekspres, vücut ayrıştırıcı, lodash, kask, mysql uygulama kullanımı çalıştırılırken kullanılır - mocha, istanbul, chai, sonarqube-tarayıcı tüm geliştirme sırasında kullanılırken bağımlılık koymak için kaydedin, bu yüzden dev bağımlılıkları.

npm bağlantısı veya npm kurulumu proje klasörünüzdeki bağımlılık modülleriyle birlikte dev-bağımlılık modüllerini de yükleyecektir


3

Buradaki tüm açıklamalar harika, ama çok önemli bir şey yok: Sadece üretim bağımlılıklarını nasıl kurarsınız? (geliştirme bağımlılıkları olmadan). Biz ayırmak dependenciesdan devDependencieskullanarak --saveveya --save-dev. Kullandığımız her şeyi yüklemek için:

npm i

Yalnızca üretim paketlerini kurmak için şunları kullanmalıyız:

npm i --only=production

0

Fikirlerimi şöyle eklemek istiyorum

Birisi kodlarınızı kendiniz kullanmak yerine kullandığında tüm farklıların görüneceğini düşünüyorum

Örneğin, şu adrese sahip bir HTTP kitaplığı yazıyorsunuz: node's request

Kütüphanenizde,

dize ve nesneyi işlemek için lodash kullandınız, lodash olmadan kodlarınız çalışamaz

Birisi HTTP kitaplığınızı kodlarının bir parçası olarak kullanıyorsa. Kodlarınız onunla derlenecek.

Eğer koymak gerek Yani kodlar, lodash ihtiyaç dependenciesiçin derleme


monaco-editorWeb editörü gibi bir proje yazarsanız ,

tüm kodlarınızı paketleyin ve web paketini product env librarykullanın, derleme tamamlandığında yalnızca birmonaco-min.js

Yani birisi --saveya da --save-dependenciessadece ihtiyacı olanmonaco-min.js

Özet:

  1. Birisi kodlarınızı derlemek istiyorsa (kütüphane olarak kullanın), lodashkodlarınız tarafından kullanılan kodlarıdependencies

  2. Birisi kodlarına fazla özellik eklemek istiyorsanız, o gerekmez unit testve compilerbu koymak,dev-dependencies


0

İnsanlar kötü şeyler yapmak için üretimde npm kullanıyor, Node.js bunun bir örneğidir, bu yüzden tüm geliştirici araçlarınızın çalışmasını istemezsiniz.

Sunucunuza koymak için yapı dosyaları oluşturmak için gulp (veya benzeri) kullanıyorsanız, o zaman gerçekten önemli değil.

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.