Mengapa, misalnya, plugin Grunt mendefinisikan ketergantungannya pada grunt sebagai " dependensi rekan "?
Mengapa plugin tidak memiliki Grunt sebagai ketergantungannya sendiri di grunt-plug / node_modules ?
Ketergantungan sebaya dijelaskan di sini: https://nodejs.org/en/blog/npm/peer-dependencies/
Tapi saya tidak begitu mengerti.
Contoh
Saya sedang bekerja dengan AppGyver Steroid saat ini yang menggunakan tugas Grunt untuk membangun file sumber saya ke folder / dist / untuk dilayani di perangkat lokal. Saya cukup baru di npm dan mendengus jadi saya ingin sepenuhnya memahami apa yang sedang terjadi.
Sejauh ini saya mendapatkan ini:
[rootfolder] /package.json memberitahu npm itu tergantung pada grunt-steroids
paket npm untuk pengembangan:
"devDependencies": {
"grunt-steroids": "0.x"
},
Baik. Menjalankan npm install di [rootfolder] mendeteksi ketergantungan dan menginstal grunt-steroid di [rootfolder] / node_modules / grunt-steroids .
Npm kemudian membaca [rootfolder] /node_modules/grunt-steroids/package.json sehingga dapat menginstal grunt-steroids
dependensi sendiri .:
"devDependencies": {
"grunt-contrib-nodeunit": "0.3.0",
"grunt": "0.4.4"
},
"dependencies": {
"wrench": "1.5.4",
"chalk": "0.3.0",
"xml2js": "0.4.1",
"lodash": "2.4.1"
},
"peerDependencies": {
"grunt": "0.4.4",
"grunt-contrib-copy": "0.5.0",
"grunt-contrib-clean": "0.5.0",
"grunt-contrib-concat": "0.4.0",
"grunt-contrib-coffee": "0.10.1",
"grunt-contrib-sass": "0.7.3",
"grunt-extend-config": "0.9.2"
},
Paket " dependensi " diinstal ke dalam [rootfolder] / node_modules / grunt-steroids / node_modules yang logis untuk saya.
" DevDependencies " tidak diinstal, yang saya yakin dikendalikan oleh npm mendeteksi saya hanya mencoba untuk menggunakan grunt-steroids
, dan tidak mengembangkannya.
Tapi kemudian kita memiliki " peerDependencies ".
Ini dipasang di [rootfolder] / node_modules , dan saya tidak mengerti mengapa ada dan tidak di [rootfolder] / node_modules / grunt-steroids / node_modules sehingga konflik dengan plugin kasar lainnya (atau apa pun) dihindari?
sumber
"grunt": "0.4.4"
keduanya dalam devDependencies dan peerDependencies, dan masuk akal bagi saya untuk memiliki duplikat di sana, karena itu berarti bahwa saya memerlukangrunt
paket itu untuk saya gunakan sendiri, tetapi juga para pengguna saya perpustakaan dapat menggunakan versi mereka sendiri, selama itu menghormati kunci versi peerDependencies. Apakah itu benar? Atau apakah contoh OP itu sangat buruk?JacksModule
tergantungJillsModule ^1.0.0
denganJillsModule
menjadi ketergantungan sebayaJacksModule
danYourCoolProject
sedang menggunakanJacksModule
danJillsModule ^2.0.0
, kami akan mendapatkan peringatan ketergantungan teman sebaya oleh NPM, yang akan menyarankan kami untuk menginstalJillsModule ^1.0.0
juga. Tetapi apa yang terjadi kemudian?YourCoolProject
sekarang akan memiliki dua versi yangJillsModule
dapat diimpor melaluiimport jillsModule from "..."
? Dan bagaimana saya ingat bahwa ketika saya menggunakanJacksModule
saya harus memberikannya contohJillsModule v1.0.0
?JacksModule
repo, memutakhirkannya untuk bergantung padaJillsModule ^2.0.0
dan menawarkan PR kepada pengelola proyek. Mungkin membantu untuk mengirimkan bug terlebih dahulu dengan mengatakan bahwa dependensi ini sudah usang dan Anda ingin membantu memperbaruinya. Jika Anda membuat PR yang baik, sebagian besar pengelola perpustakaan akan menggabungkannya dan berterima kasih untuk itu. Jika pengelola tidak responsif, Anda dapat menerbitkan garpu Anda ke NPM yang diberi nama dengan nama Anda dan menggunakan garpu Anda sebagai gantinya. Bagaimanapun, ada solusi tetapipeerDependencies
tidak menyelesaikannya sendiri.Saya akan merekomendasikan Anda untuk membaca artikel itu lagi terlebih dahulu. Agak membingungkan tetapi contoh dengan winston-mail menunjukkan kepada Anda mengapa:
Dalam hal ini, dimungkinkan untuk memiliki beberapa versi paket yang akan menyebabkan beberapa masalah. Ketergantungan sebaya memungkinkan pengembang npm untuk memastikan bahwa pengguna memiliki modul tertentu (dalam folder root). Tapi Anda benar dengan titik yang menggambarkan satu versi spesifik dari suatu paket akan menyebabkan masalah dengan paket lain menggunakan versi lain. Masalah ini berkaitan dengan pengembang npm, seperti yang dinyatakan dalam artikel
Oleh karena itu pengembang harus mengikuti semver untuk mendefinisikan peerDependencies. Anda harus membuka masalah untuk paket steroid-steroid di GitHub ...
sumber
multiple versions of a package which would cause some issues
tetapi bukankah itu inti dari manajer paket? Mereka bahkan mendiskusikan hal ini lebih jauh di artikel yang sama di mana ada 2 versi dari paket yang sama dalam proyek: satu disediakan oleh pengembang dan satu disediakan oleh perpustakaan pihak ke-3.winston
contoh apakah sekarang saya tidak dapat menggunakanwinston-mail
perpustakaan karena versi saya tidak cocok dengan ketergantungan teman? Saya lebih suka memiliki downgrade sementara dari yang terbaru dan terbaik untuk perpustakaan 1 daripada tidak dapat menggunakannya sama sekali.peerDependencies
dijelaskan dengan contoh sesederhana mungkin:menjalankan npm menginstal di myPackage akan menimbulkan kesalahan karena mencoba menginstal versi Bereaksi
^15.0.0
DANfoo
yang hanya kompatibel dengan Bereaksi^16.0.0
.peerDependencies TIDAK diinstal.
sumber
foo
berfungsi dengan kedua Bereaksi 15 dan Bereaksi 16 maka ia dapat mendaftar peerDependency sebagai>=15 < 17
.