Bu belge sorumu çok zayıf bir şekilde yanıtlıyor. Bu açıklamaları anlamadım. Birisi daha basit kelimelerle anlatabilir mi? Basit kelimeler seçmek zorsa belki örneklerle?
EDIT ayrıca yakından ilişkili olan ve karışıklığa neden olabilecek peerDependencies
eklendi.
Önemli davranış farklılıklarının özeti:
dependencies
her ikisine de yüklenir:package.json
içeren bir dizinden npm install
npm install $package
devDependencies
şunlardır:--production
bayrağını geçmediğiniz sürece package.json
içeren bir dizindeki npm install
üzerine de yüklenir (Gayan Charith'in cevabını yukarı oylayın).--dev
seçeneğini vermediğiniz sürece npm install "$package"
ile başka bir dizine yüklenmez.peerDependencies
:da başlaması bekleniyor][5] (test edilmedi):
npm install`da eksikse bir uyarı verir ve bağımlılığı kendiniz manuel olarak çözmeniz gerekir. Çalıştırırken, bağımlılık eksikse, bir hata alırsınız (@nextgentech tarafından belirtilmiştir)bundledDependencies
: https://stackoverflow.com/questions/11207638/advantages-of-bundleddependencies-over-normal-dependencies-in-npm?lq=1optionalDependencies
(Aidan Feldman tarafından bahsedilmiştir]9)"bağımlılıklar" çalıştırmak için gereklidir, "devDependencies" sadece geliştirmek için, örneğin: birim testleri, CoffeeScript'ten JavaScript'e transpilasyon, küçültme, ...
Eğer bir paket geliştirecekseniz, onu indirirsiniz (örneğin git clone
ile), package.json
içeren kök dizinine gider ve çalıştırırsınız:
npm install
Asıl kaynağa sahip olduğunuz için, onu geliştirmek istediğiniz açıktır, bu nedenle varsayılan olarak hem dependencies
(elbette geliştirmek için çalıştırmanız gerektiğinden) hem de devDependency
bağımlılıkları da yüklenir.
Bununla birlikte, yalnızca kullanmak için bir paket yüklemek isteyen bir son kullanıcıysanız, herhangi bir dizinden yapacaksınız:
npm install "$package"
Bu durumda, normalde geliştirme bağımlılıklarını istemezsiniz, bu nedenle sadece paketi kullanmak için gerekenleri alırsınız: dependencies
.
Bu durumda geliştirme paketlerini gerçekten yüklemek istiyorsanız, dev
yapılandırma seçeneğini true
olarak ayarlayabilirsiniz, muhtemelen komut satırından şu şekilde:
npm install "$package" --dev
Bu çok daha az yaygın bir durum olduğu için seçenek varsayılan olarak false
dir.
(3.0'dan önce test edilmiştir)
Kaynak: https://nodejs.org/en/blog/npm/peer-dependencies/
Normal bağımlılıklarda, bağımlılığın birden fazla sürümüne sahip olabilirsiniz: sadece bağımlılığın node_modules
içine kurulur.
Örneğin, bağımlılık1
ve bağımlılık2
farklı sürümlerde bağımlılık3
e bağlıysa, proje ağacı şöyle görünecektir:
root/node_modules/
|
+- dependency1/node_modules/
| |
| +- dependency3 v1.0/
|
|
+- dependency2/node_modules/
|
+- dependency3 v2.0/
Ancak eklentiler, normalde diğer pakete ihtiyaç duymayan paketlerdir ve bu bağlamda host olarak adlandırılır. Bunun yerine:
dependency1
ve dependency2
eşleri dependency3
e bağlıysa, proje ağacı şöyle görünecektir:root/node_modules/
|
+- dependency1/
|
+- dependency2/
|
+- dependency3 v1.0/
Bu, package.json
dosyanızda dependency3
ten hiç bahsetmemenize rağmen gerçekleşir.
Bunun Inversion of Control tasarım modelinin bir örneği olduğunu düşünüyorum.
Eş bağımlılıkların prototipik bir örneği Grunt, ana bilgisayar ve eklentileridir.
Örneğin, https://github.com/gruntjs/grunt-contrib-uglify gibi bir Grunt eklentisinde şunu göreceksiniz:
grunt
bir eş-bağımlılıktır
require('grunt')
tests/
altında: aslında program tarafından kullanılmıyor.
Daha sonra, kullanıcı bir eklenti kullanacağı zaman, grunt.loadNpmTasks('grunt-contrib-uglify')
satırını ekleyerek eklentiyi Gruntfile
dan dolaylı olarak isteyecektir, ancak kullanıcının doğrudan çağıracağı grunt
olacaktır.
Her eklenti farklı bir Grunt sürümü gerektiriyorsa bu işe yaramayacaktır.Bence dokümantasyon soruyu oldukça iyi yanıtlıyor, belki de node / diğer paket yöneticilerine yeterince aşina değilsiniz. Muhtemelen sadece Ruby bundler hakkında biraz bilgim olduğu için anlıyorum.
Anahtar satır şudur:
Bu şeyler bir paketin kökünden npm link veya npm install yapıldığında yüklenir ve diğer npm yapılandırma parametreleri gibi yönetilebilir. Konu hakkında daha fazla bilgi için npm-config(7)'ye bakın.
Ve sonra npm-config(7) altında dev
i bulun:
Default: false
Type: Boolean
Install dev-dependencies along with packages.
Sadece geliştirme için gerekli olan ve üretimde ihtiyaç duyulmayan bazı modüller ve paketler vardır. Dokümantasyon]1'de belirtildiği gibi:
Birisi modülünüzü indirip programında kullanmayı planlıyorsa, muhtemelen kullandığınız harici test veya dokümantasyon çerçevesini indirmek ve oluşturmak istemez veya buna ihtiyaç duymaz. Bu durumda, bu ek öğeleri bir devDependencies hash'inde listelemek en iyisidir.