Bu belge sorumu çok kötü yanıtlıyor. Bu açıklamaları anlamadım. Birisi daha basit kelimelerle söyleyebilir mi? Belki basit kelimeler seçmek zorsa örneklerle?
EDIT ayrıca peerDependencies
yakından ilişkilidir ve karışıklığa neden olabilir.
Bu belge sorumu çok kötü yanıtlıyor. Bu açıklamaları anlamadım. Birisi daha basit kelimelerle söyleyebilir mi? Belki basit kelimeler seçmek zorsa örneklerle?
EDIT ayrıca peerDependencies
yakından ilişkilidir ve karışıklığa neden olabilir.
Yanıtlar:
Önemli davranış farklılıklarının özeti:
dependencies
her ikisine de yüklenir:
npm install
içeren bir dizinden package.json
npm install $package
başka bir dizindedevDependencies
şunlardır:
npm install
, içeren bir dizine yüklenir ( Gayan Charith'in cevabını yükseltin ).package.json
--production
npm install "$package"
başka bir dizine yüklenmez --dev
.npm install
ve bağımlılığı kendiniz manuel olarak çözmeniz gerekir. Çalışırken, bağımlılık eksikse, bir hata alırsınız ( @nextgentech tarafından belirtilen )Geçişlilik ( Ben Hutchison tarafından bahsedilen ):
dependencies
geçişli olarak kurulur: A için B gerekiyorsa ve B için C gerekiyorsa, C kurulur, aksi takdirde B çalışmaz ve hiçbiri A olmaz.
devDependencies
geçici olarak yüklenmedi. A test etmek için B testine ihtiyacımız yok, bu yüzden B'nin test bağımlılıkları dışarıda bırakılabilir.
Burada tartışılmayan ilgili seçenekler:
bundledDependencies
Bu, aşağıdaki soru üzerinde tartışılmaktadır: Paketlenmiş Bağımlılıkların NPM'deki normal bağımlılıklara göre avantajlarıoptionalDependencies
( Aidan Feldman tarafından bahsedilen )dependencies
çalıştırmak için gereklidir devDependencies
, örneğin: birim testleri, CoffeeScript'ten JavaScript'e çeviri, küçültme, ...
Bir paket geliştirecekseniz, paketi indirirsiniz (örn. Yoluyla git clone
), içeren kök dizinine gidersiniz package.json
ve şunları çalıştırırsınız:
npm install
Gerçek 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 gerekir) hem de devDependency
bağımlılıklar da yüklenir.
Ancak, yalnızca kullanmak için bir paket yüklemek isteyen son kullanıcıysanız, herhangi bir dizinden yapacaksınız:
npm install "$package"
Sadece paketi kullanmak üzere gerekli olanı almak böylece durumda, normalde, geliştirme bağımlılıkları istemiyoruz: dependencies
.
Bu durumda geliştirme paketlerini gerçekten yüklemek istiyorsanız, dev
yapılandırma seçeneğini true
muhtemelen komut satırından şu şekilde ayarlayabilirsiniz :
npm install "$package" --dev
Bu seçenek false
varsayılan olarak, çünkü bu çok daha az yaygın bir durumdur.
(3.0'dan önce test edilmiştir)
Kaynak: https://nodejs.org/en/blog/npm/peer-dependencies/
Düzenli bağımlılıklarla, bağımlılığın birden fazla sürümüne sahip olabilirsiniz: basitçe node_modules
bağımlılığın içine yüklenir .
Örneğin , proje ağacının farklı sürümlere bağlı olması dependency1
ve dependency2
her ikisinin birden olması durumunda dependency3
:
root/node_modules/
|
+- dependency1/node_modules/
| |
| +- dependency3 v1.0/
|
|
+- dependency2/node_modules/
|
+- dependency3 v2.0/
Ancak eklentiler, normalde bu bağlamda ana bilgisayar olarak adlandırılan diğer paketi gerektirmeyen paketlerdir . Yerine:
Eğer Örn dependency1
ve dependency2
bağlı akran dependency3
, proje ağaç gibi görünecektir:
root/node_modules/
|
+- dependency1/
|
+- dependency2/
|
+- dependency3 v1.0/
Eğer söz asla olsa bile gerçekleşir dependency3
sizin de package.json
dosyaya.
Bence bu, Tersine Çevirme kontrol deseninin bir örneği.
Eş bağımlılıklarının prototip bir örneği Grunt, ana bilgisayar ve eklentileridir.
Örneğin, https://github.com/gruntjs/grunt-contrib-uglify gibi bir Grunt eklentisinde şunları göreceksiniz:
grunt
bir peer-dependency
require('grunt')
altında tests/
: aslında program tarafından kullanılmaz.Daha sonra, kullanıcı bir eklenti kullanacaksa, Gruntfile
bir grunt.loadNpmTasks('grunt-contrib-uglify')
satır ekleyerek dolaylı olarak eklentiyi gerektirecektir , ancak grunt
kullanıcı doğrudan arayacaktır.
Her eklenti farklı bir Grunt sürümü gerektiriyorsa bu işe yaramaz.
Belgelerin soruyu oldukça iyi yanıtladığını düşünüyorum, belki sadece düğüm / diğer paket yöneticilerine yeterince aşina değilsiniz. Muhtemelen anlıyorum çünkü Ruby bundler hakkında biraz bilgim var.
Anahtar hat:
Bu şeyler, bir paketin kökünden npm bağlantısı veya npm kurulumu yapılırken yüklenir ve diğer herhangi bir npm yapılandırma parametresi gibi yönetilebilir. Konu hakkında daha fazla bilgi için bkz. Npm-config (7).
Ve sonra npm-config (7) altında şunları bulun dev
:
Default: false
Type: Boolean
Install dev-dependencies along with packages.
npm install package
, şimdi demek istediğini düşündüğümden ziyade, dev paket bağımlılığı olmayan tüm paketleri yüklemek için kullanacağınız bir komut gibi okunuyor. bunu okumadan önce. Ben olsaydım, [paket-adı] demek için düzenlerdim, bu da demek istediğin şeyin 'insert-name-here' olduğunu açıkça gösterir.
peerDependencies
, yaklaşan npm @ 3'teki değişen davranışı yansıtacak şekilde güncellenmelidir . Gönderen blog.npmjs.org/post/110924823920/npm-weekly-5 . Akran bağımlılık zaten yüklü değilse otomatik olarak artık akran bağımlılığını indirirken olmayacak" Bunun yerine, sizi uyarabilir edeceğiz Bu gerektirir. peerDependency, kendinizle manuel olarak çakışıyor, ancak uzun vadede bu, paketlerinizin bağımlılıklarıyla ilgili zor bir noktaya gelme olasılığınızı azaltacaktır. "
npm install
A paketinden çalıştırırsanız , B ve C alırsınız, ancak D alırsınız.
devDependencies
yüklenmemiş olduğunu belirtmek önemlidir . NODE_ENV
production
DevDependencies yüklemek istemiyorsanız kullanabilirsiniz npm install --production
--save
seçenek artık gerekli değildir. "Npm paketimi kur" seçeneğini kullanırsanız, paketimi package.json
dosyanıza bağımlılık olarak ekler.
Örnek olarak, mocha normalde bir devDependency olur, çünkü üretimde test gerekli değildir, ancak ifade bir bağımlılık olur.
bağımlılıklar
Kodunuzdan çağırdığınız işlevleri sağlayan bir kütüphane gibi projenizin çalışması gereken bağımlılıklar .
Geçişli olarak kurulurlar (A, B'ye bağlı ise C'ye bağlıysa, A'ya npm kurulumu B ve C'yi kuracaktır).
Örnek: lodash: projeniz bazı lodash işlevlerini çağırıyor.
devBağımlılıklar
Kodunuzu alıp javascript, test çerçeveleri veya belge oluşturucularına derleyen derleyiciler gibi yalnızca geliştirme veya serbest bırakma sırasında ihtiyacınız olan bağımlılıklar.
Geçici olarak kurulmazlar (A, B devine bağlıysa C'ye bağlıysa, A'ya npm yüklemesi yalnızca B'yi yükleyecektir).
Örnek: grunt: projeniz kendini inşa etmek için grunt kullanıyor.
peerDependencies
Projenizin üst projede yer aldığı veya değiştirdiği bağımlılıklar, genellikle başka bir kütüphane veya araç için bir eklenti. Üst proje (projenize bağlı olacak proje), bağlandığınız projeye bağımlı olduğundan emin olmak için bir kontrol olması amaçlanmıştır. Bu nedenle, B kütüphanesine işlevsellik katan bir C eklentisi yaparsanız, A projesini yapan birinin C'ye bağımlı olması durumunda B'ye bağımlı olması gerekir.
Yüklü değiller (npm <3 olmadığı sürece) için kontrol edildi.
Örnek: homurdanma: projeniz homurdanmaya işlevsellik katar ve sadece homurdanma kullanan projelerde kullanılabilir.
Bu belgeler akran bağımlılıklarını gerçekten iyi açıklamaktadır: https://nodejs.org/en/blog/npm/peer-dependencies/
Ayrıca, npm belgeleri zaman içinde geliştirildi ve şimdi farklı bağımlılık türleri hakkında daha iyi açıklamalar var: https://github.com/npm/cli/blob/latest/doc/files/package.json.md#devdependencies
Bir paketi package.json'a dev bağımlılıkları olarak kaydetmek için :
npm install "$package" --save-dev
Çalıştırdığınızda npm install
hem devDependencies
ve hem de yükleyecektir dependencies
. Yükleme devDependencies
çalıştırmasını önlemek için :
npm install --production
Üretimde ihtiyaç duyulmayan, sadece geliştirme için gerekli olan bazı modüller ve paketler vardır. Belgelerde söylediği gibi :
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. Bu durumda, bu ek öğeleri bir devDependencies karma değerinde listelemek en iyisidir.
Benim için daha açık hale getiren basit bir açıklama:
Uygulamanızı dağıtırken, bağımlılıktaki modüllerin yüklenmesi gerekir; aksi takdirde uygulamanız çalışmaz. DevDependencies içindeki modüllerin, o makinede geliştirmediğiniz için üretim sunucusuna kurulması gerekmez. bağlantı
vendor.js
inline olacak, derlenmiş kod repo taahhüt edilirse tüm deps devler olmalıdır? Ve başka bir deyişle, sadece derlemek değil, modülü derlemeniz garip olduğu için (ve alt modüllerde herhangi bir değişikliğin gerilemeye yol açabileceği için test burada da bir yerde) garip olduğu için ...
webpack -p
. lütfen soruma cevap ver.
Bu bağımlılık açıklamaları hakkındaki görüşüme yanıtı eklemek istiyorum
dependencies
kod tabanınızda doğrudan kullanım, genellikle üretim kodunda yer alan şeyler veya kod parçaları için kullanılırdevDependencies
oluşturma işlemi, uç kodun nasıl biteceğini yönetmenize yardımcı olan araçlar, üçüncü taraf test modülleri, (örn. webpack şeyler) için kullanılırKısacası
Bağımlılıklar - npm install <package> --save-prod
uygulamanızın gerektirdiği paketleri üretim ortamına yükler.
DevDependencies - npm install <package> --save-dev
yalnızca yerel geliştirme ve test için gerekli paketleri kurar
Sadece yazmak npm install
pakette belirtilen tüm paketleri yükler. Json
yerel bilgisayarınızda çalışıyorsanız yazın npm install
ve devam edin :)
peerDependencies
Ben bu kod parçasını okumak kadar oldukça benim için mantıklı gelmedi bir blog yazısı konu üzerine Ciro yukarıda belirtilen :
[ Eklentiler ] 'in ihtiyacı olan, eklentiler ve ana bilgisayar paketleri arasındaki bu “bağımlılıkları” ifade etmenin bir yoludur. “Yalnızca ana bilgisayar paketimin 1.2.x sürümüne bağlıyken çalışıyorum, bu yüzden beni kurarsanız, uyumlu bir ana bilgisayarın yanında olduğundan emin olun.” Bu ilişkiye akran bağımlılığı diyoruz.
peerDependencies
eklentiler içindir, işlevlerini yerine getirmek için "ana bilgisayar" kitaplığı gerektiren, ancak ana bilgisayarın en son sürümü yayınlanmadan önce yazılmış bir kitaplık olabilir .
Ben yazarsam, olduğu PluginX v1
için HostLibraryX v3
ve yürüyüp, garantisi yok PluginX v1
olduğunda çalışacaktır HostLibraryX v4
(hatta HostLibraryX v3.0.1
serbest bırakılır).
Eklentinin bakış açısından, yalnızca ana bilgisayar kitaplığına işlevler ekler . Gerçekten bir eklentiye bağımlılık eklemek için ana bilgisayar "gerekmez" ve eklentiler genellikle tam anlamıyla kendi ana bilgisayar bağlı değildir . Ana makineniz yoksa, eklenti zararsız bir şekilde hiçbir şey yapmaz.
Bu dependencies
, eklentiler için gerçekten doğru kavram olmadığı anlamına gelir .
Daha da kötüsü, ev sahibime bir bağımlılık gibi davranılırsa , aynı blog gönderisinden bahsettiğimizde (bu cevabın oluşturulmuş ana bilgisayar ve eklentisini kullanmak için biraz düzenlenmiş) sonuçlanırız:
Ama şimdi, [HostLibraryX'in çağdaş sürümünü PluginX'e bağımlılık olarak ele alırsak,] çalıştırılması
npm install
beklenmedik bağımlılık grafiğiyle sonuçlanır.├── HostLibraryX@4.0.0 └─┬ PluginX@1.0.0 └── HostLibraryX@3.0.0
Eklentiden gelen ince hataları hayal gücünüze ana uygulamadan farklı bir [HostLibraryX] API kullanarak bırakacağım.
... eklentilerin bütün noktası bu. Ev sahibi, tüm eklentileri için bağımlılık bilgilerini içerecek kadar güzel olsaydı, bu sorunu çözecekti, ancak bu da büyük bir yeni kültürel sorun getirecektir : eklenti yönetimi!
Eklentilerin asıl amacı anonim olarak eşleşebilmeleridir. Mükemmel bir dünyada, ev sahibinin hepsini yönetmesi temiz ve düzenli olurdu, ancak kütüphaneleri sürü kedilere ihtiyacımız olmayacak.
Bunun yerine, akran olma kavramımız var. Ne ana bilgisayar ne de eklenti diğerinin bağımlılık grubunda yer almaz. Her ikisi de bağımlılık grafiğinin aynı düzeyinde yaşıyor.
Ben isem PluginX v1
ve beklemek bir Peer'a (olduğunu, bir peerDependency var ) HostLibraryX v3
, öyle söylerim. En son Otomatik geçiş için ettiyseniz HostLibraryX v4
( 's versiyonu o notta 4 ) VE gelmiş Plugin v1
yüklü, doğru, bilmek gerekir?
npm
bu durumu benim için yönetemiyorum -
"Hey, kullandığını görüyorum
PluginX v1
! Otomatik olarak v4'tenHostLibraryX
v3'e geçiyorum, kk?"
... ya da ...
"Hey kullandığınızı görüyorum
PluginX v1
. BuHostLibraryX v3
, son güncellemeniz sırasında toz içinde kalmanızı bekliyor . Güvende olmak için otomatik olarak kaldırıyorumPlugin v1
!! 1!
Hayýr, npm ?!
Yani npm yapmaz. Durum hakkında sizi uyarır ve HostLibraryX v4
uygun bir eş olup olmadığını anlamanıza izin verir Plugin v1
.
peerDependency
Eklentilerde iyi yönetim, bu kavramın pratikte daha sezgisel çalışmasını sağlayacaktır. Gönderen blog post , yine ...
Tek bir tavsiye: düzenli bağımlılıklardan farklı olarak, akran bağımlılığı gereklilikleri yumuşak olmalıdır. Eş bağımlılıklarınızı belirli yama sürümlerine kilitlememelisiniz. Bir Chai eklentisinin Chai 1.4.1'e akranına bağlı olması gerçekten sinir bozucu olurken, diğeri Chai 1.5.0'a bağımlıysa, sadece yazarlar tembel olduğu ve Chai'nin asgari sürümünü anlamak için zaman harcamadıkları için gerçekten can sıkıcı olurdu. ile uyumlu.
Bağımlılıklar ve geliştirici bağımlılıklar
Geliştirici bağımlılıkları, yalnızca geliştirme sırasında gerekli olan modüllerdir, oysa çalışma zamanında bağımlılıklar gerekir. Uygulamanızı dağıtıyorsanız, bağımlılıkların yüklenmesi gerekir, aksi takdirde uygulamanız çalışmaz. Kodunuzdan programın çalışmasını sağlayan kitaplıklar bağımlılık olarak kabul edilebilir.
Örneğin, Tepki, Tepki - dom
Bu makinede geliştirmeyeceğiniz için geliştirme bağımlılığı modüllerinin üretim sunucusuna kurulması gerekmez. Kodunuzu javascript, test çerçeveleri ve belge oluşturuculara dönüştüren derleyiciler, yalnızca geliştirme sırasında gerekli oldukları için geliştirici bağımlılık olarak kabul edilebilir.
Ör- ESLint, Babel, web paketi
@FYI,
mod-a
dev-dependents:
- mod-b
dependents:
- mod-c
mod-d
dev-dependents:
- mod-e
dependents:
- mod-a
----
npm install mod-d
installed modules:
- mod-d
- mod-a
- mod-c
----
checkout the mod-d code repository
npm install
installed modules:
- mod-a
- mod-c
- mod-e
Npm'de yayınlıyorsanız, doğru modüller için doğru bayrağı kullanmanız önemlidir. Npm modülünüzün çalışması gereken bir şeyse, modülü bağımlılık olarak kaydetmek için "--save" işaretini kullanın. Modülünüzün çalışması gerekmeyen bir şeyse ancak test için gerekliyse, "--save-dev" bayrağını kullanın.
# For dependent modules
npm install dependent-module --save
# For dev-dependent modules
npm install development-module --save-dev
Basit bir açıklama buldum.
Kısa cevap:
bağımlılıkları "... projenizin gerçekten üretimde çalışabilmesi için ihtiyaç duydukları."
devDependencies "... geliştirme sırasında ihtiyacınız olanlardır."
peerDependencies "kendi kitaplığınızı bağımlılık olarak kullanılabilmesi için oluşturmak ve yayınlamak istiyorsanız"
Bu yayında daha fazla ayrıntı: https://code-trotter.com/web/dependencies-vs-devdependencies-vs-peerdependencies
optionalDependencies
Şimdi de var .