Dokumentasi ini menjawab pertanyaan saya dengan sangat buruk. Saya tidak mengerti penjelasan itu. Adakah yang bisa mengatakannya dengan kata-kata yang lebih sederhana? Mungkin dengan contoh jika sulit untuk memilih kata-kata sederhana?
EDIT juga menambahkan peerDependencies
, yang terkait erat dan dapat menyebabkan kebingungan.
optionalDependencies
sekarang.Jawaban:
Ringkasan perbedaan perilaku penting:
dependencies
diinstal pada keduanya:npm install
dari direktori yang berisipackage.json
npm install $package
di direktori lain mana pundevDependencies
adalah:npm install
pada direktori yang berisipackage.json
, kecuali jika Anda melewati--production
bendera (lanjutkan jawaban Gayan Charith ).npm install "$package"
direktori lain mana pun, kecuali jika Anda memberinya--dev
pilihan.peerDependencies
:npm install
, dan Anda harus menyelesaikan sendiri ketergantungan secara manual. Saat berjalan, jika ketergantungan tidak ada, Anda mendapatkan kesalahan (disebutkan oleh @nextgentech )Transitivitas (disebutkan oleh Ben Hutchison ):
dependencies
dipasang secara transitif: jika A membutuhkan B, dan B membutuhkan C, maka C akan diinstal, jika tidak, B tidak dapat bekerja, dan begitu pula A.devDependencies
tidak diinstal secara transitif. Misalnya kita tidak perlu menguji B untuk menguji A, sehingga ketergantungan pengujian B dapat diabaikan.Opsi terkait tidak dibahas di sini:
bundledDependencies
yang dibahas pada pertanyaan berikut: Keuntungan bundledDependencies atas dependensi normal di NPMoptionalDependencies
(disebutkan oleh Aidan Feldman )ketergantungan
dependencies
diperlukan untuk menjalankan,devDependencies
hanya untuk mengembangkan, misalnya: tes unit, Transkrip CoffeeScript ke JavaScript, minifikasi, ...Jika Anda ingin mengembangkan sebuah paket, Anda mengunduhnya (mis. Via
git clone
), pergi ke root-nya yang berisipackage.json
, dan jalankan:Karena Anda memiliki sumber aktual, jelas bahwa Anda ingin mengembangkannya, jadi secara default, keduanya
dependencies
(karena Anda harus, tentu saja, jalankan untuk mengembangkan) dandevDependency
dependensi juga diinstal.Namun, jika Anda hanya pengguna akhir yang hanya ingin menginstal paket untuk menggunakannya, Anda dapat melakukannya dari direktori mana saja:
Dalam hal ini, Anda biasanya tidak ingin dependensi pembangunan, sehingga Anda hanya mendapatkan apa yang dibutuhkan untuk menggunakan paket:
dependencies
.Jika Anda benar-benar ingin menginstal paket pengembangan dalam kasus itu, Anda dapat mengatur
dev
opsi konfigurasitrue
, mungkin dari baris perintah sebagai:Opsi ini
false
secara default karena ini adalah kasus yang jauh lebih jarang.dependensi sebaya
(Diuji sebelum 3.0)
Sumber: https://nodejs.org/en/blog/npm/peer-dependencies/
Dengan dependensi reguler, Anda dapat memiliki beberapa versi dependensi: itu hanya diinstal di
node_modules
dalam dependensi.Misalnya jika
dependency1
dandependency2
keduanya bergantung padadependency3
versi yang berbeda, pohon proyek akan terlihat seperti:Plugin, bagaimanapun, adalah paket yang biasanya tidak memerlukan paket lain, yang disebut host dalam konteks ini. Sebagai gantinya:
Misalkan jika
dependency1
dandependency2
rekan bergantung padadependency3
, pohon proyek akan terlihat seperti:Ini terjadi meskipun Anda tidak pernah menyebutkan
dependency3
dalampackage.json
file Anda .Saya pikir ini adalah contoh dari pola desain Inversion of Control .
Contoh prototipikal dari dependensi rekan adalah Grunt, host, dan plugin-nya.
Misalnya, pada plugin Grunt seperti https://github.com/gruntjs/grunt-contrib-uglify , Anda akan melihat bahwa:
grunt
adalahpeer-dependency
require('grunt')
bawahtests/
: itu tidak benar-benar digunakan oleh program.Kemudian, ketika pengguna akan menggunakan plugin, ia secara implisit akan memerlukan plugin dari
Gruntfile
dengan menambahkangrunt.loadNpmTasks('grunt-contrib-uglify')
baris, tetapigrunt
pengguna akan langsung menelepon.Ini tidak akan berfungsi jika masing-masing plugin memerlukan versi Grunt yang berbeda.
Manual
Saya pikir dokumentasi menjawab pertanyaan dengan cukup baik, mungkin Anda tidak cukup akrab dengan node / manajer paket lainnya. Saya mungkin hanya memahaminya karena saya tahu sedikit tentang Ruby bundler.
Kuncinya adalah:
Dan kemudian di bawah npm-config (7) temukan
dev
:sumber
npm install package
adalah perintah yang akan Anda gunakan untuk menginstal semua paket yang bukan dependensi dev, daripada apa yang sekarang saya pikir Anda maksudkan, yaitu 'instal paket yang disebut [paket]', yang menurut saya itu berhasil sebelum membaca ini. Jika saya jadi Anda, saya akan mengedit untuk mengatakan [nama-paket] yang dengan jelas menunjukkan bahwa yang Anda maksud adalah 'masukkan-nama-di sini'.peerDependencies
perilaku yang berubah di npm @ 3 mendatang. Dari blog.npmjs.org/post/110924823920/npm-weekly-5 : "Kami tidak akan lagi secara otomatis mengunduh dependensi peer. Sebaliknya, kami akan memperingatkan Anda jika dependensi peer belum diinstal. Ini mengharuskan Anda untuk menyelesaikan sendiri konflik peerDependency, secara manual, tetapi dalam jangka panjang hal ini akan membuat kecil kemungkinan Anda akan berakhir di tempat yang sulit dengan dependensi paket Anda. "npm install
dari paket A, Anda akan mendapatkan B dan C tetapi tidak D.devDependencies
tidak diinstal ketikaNODE_ENV
diatur keproduction
.Jika Anda tidak ingin menginstal devDependencies, Anda dapat menggunakan
npm install --production
sumber
--save
opsi tidak lagi diperlukan. Jika Anda melakukan "npm install my-package", itu akan menambahkan paket saya sebagai ketergantungan padapackage.json
file Anda .Sebagai contoh, moka biasanya merupakan devDependensi, karena pengujian tidak diperlukan dalam produksi, sedangkan ekspres adalah dependensi.
sumber
dependencies
Dependensi yang harus dijalankan oleh proyek Anda, seperti perpustakaan yang menyediakan fungsi yang Anda panggil dari kode Anda.
Mereka diinstal secara transitif (jika A tergantung pada B tergantung pada C, npm instal pada A akan menginstal B dan C).
Contoh: lodash: proyek Anda memanggil beberapa fungsi lodash.
devDependencies
Ketergantungan yang Anda hanya perlu selama pengembangan atau rilis, seperti kompiler yang mengambil kode Anda dan mengompilasinya menjadi javascript, kerangka kerja pengujian atau generator dokumentasi.
Mereka tidak diinstal secara transitif (jika A tergantung pada B dev-tergantung pada C, npm instal pada A akan menginstal B saja).
Contoh: grunt: proyek Anda menggunakan grunt untuk membangunnya sendiri.
peerDependencies
Ketergantungan yang terkait dengan proyek Anda, atau dimodifikasi, dalam proyek induk, biasanya merupakan plugin untuk beberapa pustaka atau alat lain. Ini hanya dimaksudkan sebagai pemeriksaan, memastikan bahwa proyek induk (proyek yang akan tergantung pada proyek Anda) memiliki ketergantungan pada proyek yang Anda kaitkan. Jadi jika Anda membuat plugin C yang menambahkan fungsionalitas ke perpustakaan B, maka seseorang yang membuat proyek A perlu memiliki ketergantungan pada B jika mereka memiliki ketergantungan pada C.
Mereka tidak diinstal (kecuali npm <3), mereka hanya diperiksa.
Contoh: grunt: proyek Anda menambahkan fungsionalitas ke grunt dan hanya dapat digunakan pada proyek yang menggunakan grunt.
Dokumentasi ini menjelaskan dependensi rekan dengan sangat baik: https://nodejs.org/en/blog/npm/peer-dependencies/
Juga, dokumentasi npm telah diperbaiki dari waktu ke waktu, dan sekarang memiliki penjelasan yang lebih baik dari berbagai jenis dependensi: https://github.com/npm/cli/blob/latest/doc/files/package.json.md#devdependencies
sumber
Untuk menyimpan paket ke package.json sebagai dependensi dev:
Ketika Anda menjalankannya
npm install
akan menginstal keduanyadevDependencies
dandependencies
. Untuk menghindari instalasidevDependencies
jalankan:sumber
Ada beberapa modul dan paket yang hanya diperlukan untuk pengembangan, yang tidak diperlukan dalam produksi. Seperti dikatakan di dokumentasi :
sumber
Penjelasan sederhana yang membuatnya lebih jelas bagi saya adalah:
Saat Anda menggunakan aplikasi Anda, modul dalam dependensi perlu diinstal atau aplikasi Anda tidak akan berfungsi. Modul di devDependencies tidak perlu diinstal pada server produksi karena Anda tidak mengembangkan pada mesin itu. tautan
sumber
vendor.js
, semua deps kita harus menjadi dep dep jika kode yang dikompilasi dimasukkan ke dalam repo? Dan itu harus dilakukan, karena hal lain yang aneh adalah Anda harus mengkompilasi modul, tidak hanya menginstalnya (dan pengujian juga di suatu tempat di sini karena setiap perubahan dalam submodul dapat menyebabkan regresi) ...webpack -p
maksud saya. tolong jawab pertanyaan saya.Saya ingin menambahkan jawaban pandangan saya tentang penjelasan dependensi ini
dependencies
digunakan untuk penggunaan langsung dalam basis kode Anda, hal-hal yang biasanya berakhir pada kode produksi, atau potongan kodedevDependencies
digunakan untuk proses pembuatan, alat yang membantu Anda mengelola bagaimana kode akhir akan berakhir, modul uji pihak ketiga, (mis. barang-barang webpack)sumber
Pendeknya
Ketergantungan -
npm install <package> --save-prod
menginstal paket yang diperlukan oleh aplikasi Anda di lingkungan produksi.DevDependencies -
npm install <package> --save-dev
menginstal paket yang hanya diperlukan untuk pengembangan dan pengujian lokalCukup ketikkan
npm install
instal semua paket yang disebutkan di package.jsonjadi jika Anda bekerja pada komputer lokal Anda cukup ketik
npm install
dan lanjutkan :)sumber
peerDependencies
tidak masuk akal bagi saya sampai saya membaca cuplikan ini dari sebuah posting blog tentang topik yang disebutkan Ciro di atas :Plugin mengharapkan versi host tertentu ...
peerDependencies
adalah untuk plugin, pustaka yang membutuhkan pustaka "host" untuk menjalankan fungsinya, tetapi mungkin telah ditulis pada suatu waktu sebelum versi terakhir dari host dirilis.Artinya, jika saya menulis
PluginX v1
untukHostLibraryX v3
dan pergi, tidak ada jaminanPluginX v1
akan bekerja ketikaHostLibraryX v4
(atau bahkanHostLibraryX v3.0.1
) dirilis.... tetapi plugin tidak bergantung pada host ...
Dari sudut pandang plugin, itu hanya menambah fungsi ke pustaka host. Saya tidak benar-benar "perlu" host untuk menambahkan dependensi ke plugin, dan plugin sering tidak benar-benar bergantung pada host mereka. Jika Anda tidak memiliki host, plugin tersebut tidak melakukan apa-apa.
Ini berarti
dependencies
sebenarnya bukan konsep yang tepat untuk plugin.Lebih buruk lagi, jika host saya diperlakukan seperti ketergantungan, kami akan berakhir dalam situasi ini yang disebutkan oleh posting blog yang sama (diedit sedikit untuk menggunakan host & plugin yang dibuat jawaban ini):
... dan tuan rumahnya jelas tidak bergantung pada plugin ...
... itulah inti dari plugin. Sekarang jika tuan rumah cukup baik untuk memasukkan informasi dependensi untuk semua pluginnya, itu akan menyelesaikan masalah, tetapi itu juga akan memperkenalkan masalah budaya baru yang sangat besar : manajemen plugin!
Inti dari plugin adalah mereka dapat berpasangan secara anonim. Di dunia yang sempurna, memiliki tuan rumah mengelola mereka semua akan rapi & rapi, tapi kami tidak akan membutuhkan perpustakaan kucing kawanan.
Jika kita tidak bergantung secara hierarkis, mungkin kita adalah teman sebaya yang saling bergantung ...
Sebagai gantinya, kami memiliki konsep menjadi teman sebaya. Baik host maupun plugin tidak berada di bucket ketergantungan yang lain. Keduanya hidup pada tingkat yang sama dari grafik ketergantungan.
... tapi ini bukan hubungan yang dapat diautomasi. <<< Moneyball !!!
Jika saya
PluginX v1
dan mengharapkan rekan (yaitu, memiliki ketergantungan peer )HostLibraryX v3
, saya akan mengatakannya. Jika Anda telah memutakhirkan secara otomatis ke yang terbaruHostLibraryX v4
(perhatikan itu versi 4 ) DAN telahPlugin v1
diinstal, Anda perlu tahu, bukan?npm
tidak dapat mengelola situasi ini untuk saya -... atau...
Bagaimana kalau tidak, npm ?!
Jadi npm tidak. Ini memberi tahu Anda tentang situasinya, dan memungkinkan Anda mengetahui apakah
HostLibraryX v4
rekan yang cocok untuk ituPlugin v1
.Coda
peerDependency
Manajemen yang baik dalam plugin akan membuat konsep ini bekerja lebih intuitif dalam praktiknya. Dari posting blog , sekali lagi ...sumber
Dependensi vs dependensi dev
Dev dependensi adalah modul yang hanya diperlukan selama pengembangan sedangkan dependensi diperlukan saat runtime. Jika Anda menggunakan aplikasi Anda, dependensi harus diinstal, atau aplikasi Anda tidak akan berfungsi. Perpustakaan yang Anda panggil dari kode Anda yang memungkinkan program untuk dijalankan dapat dianggap sebagai dependensi.
Misalnya - Bereaksi, Bereaksi - dom
Modul dependensi dev tidak perlu diinstal di server produksi karena Anda tidak akan mengembangkan di mesin itu. Kompiler yang menyamarkan kode Anda ke javascript, kerangka kerja pengujian dan generator dokumen dapat dianggap sebagai dependensi dev karena hanya diperlukan selama pengembangan.
Misalnya- ESLint, Babel, webpack
@ FYI,
Jika Anda menerbitkan ke npm, maka penting bahwa Anda menggunakan flag yang benar untuk modul yang benar. Jika itu adalah sesuatu yang perlu difungsikan oleh modul npm Anda, maka gunakan flag "--save" untuk menyimpan modul sebagai dependensi. Jika itu adalah sesuatu yang modul Anda tidak perlu berfungsi tetapi diperlukan untuk pengujian, maka gunakan bendera "--save-dev".
sumber
Ketika mencoba mendistribusikan paket npm, Anda harus menghindari penggunaan
dependencies
. Alih-alih, Anda perlu mempertimbangkan untuk menambahkanpeerDependencies
atau menghapusnyadependencies
.sumber
Saya menemukan penjelasan sederhana.
Jawaban singkat:
dependensi "... adalah yang dibutuhkan proyek Anda untuk dapat bekerja dalam produksi."
devDependencies "... adalah yang Anda butuhkan selama pengembangan."
peerDependencies "jika Anda ingin membuat dan menerbitkan perpustakaan Anda sendiri sehingga dapat digunakan sebagai dependensi"
Lebih detail dalam posting ini: https://code-trotter.com/web/dependencies-vs-devdependencies-vs-peerdependencies
sumber