Pertanyaan Apa perbedaan antara dependensi, devDependencies dan peerDependencies dalam file npm package.json?


Dokumentasi ini menjawab pertanyaan saya dengan sangat buruk. Saya tidak mengerti penjelasan itu. Dapatkah seseorang berkata dengan kata yang lebih sederhana? Mungkin dengan contoh jika sulit memilih kata-kata sederhana?


1460
2017-09-18 14:57


asal


Jawaban:


Ringkasan perbedaan perilaku penting:

  • dependencies diinstal pada keduanya:

    • npm install dari direktori yang berisi package.json
    • npm install $package pada direktori lainnya
  • devDependencies adalah:

    • juga diinstal npm install pada direktori yang berisi package.json, kecuali Anda lulus --production bendera (naik suara Jawaban Gayan Charith).
    • tidak diinstal npm install "$package" pada direktori lain, kecuali Anda memberikannya --dev pilihan.
    • tidak terpasang secara transitif.
  • peerDependencies:

    • sebelum 3.0: selalu dipasang jika hilang, dan naikkan kesalahan jika beberapa versi ketergantungan yang tidak kompatibel akan digunakan oleh dependensi yang berbeda.
    • diharapkan mulai dari 3.0 (belum diuji): beri peringatan jika tidak ada npm install, dan Anda harus menyelesaikan sendiri ketergantungan itu sendiri. Saat menjalankan, jika ketergantungan hilang, Anda mendapatkan kesalahan (disebutkan oleh @nextgentech)
  • Transitivitas (disebutkan oleh Ben Hutchison):

    • dependencies dipasang secara transitif: jika A memerlukan B, dan B memerlukan C, maka C dipasang, jika tidak B tidak dapat berfungsi, dan tidak akan A.

    • devDependencies tidak terpasang secara transitif. Misalnya. kita tidak perlu menguji B untuk menguji A, sehingga dependensi pengujian B dapat ditinggalkan.

Opsi terkait yang tidak dibahas di sini:

devDependencies

dependencies wajib berlari, devDependencies hanya untuk mengembangkan, misalnya: tes unit, Coffeescript ke transponder Javascript, minification, ...

Jika Anda akan mengembangkan paket, Anda mengunduhnya (mis. Via git clone), pergi ke akarnya yang berisi package.json, dan lari:

npm install

Karena Anda memiliki sumber yang sebenarnya, jelas bahwa Anda ingin mengembangkannya, jadi secara default keduanya dependencies (karena tentu saja Anda harus berlari untuk mengembangkan) dan devDependency dependensi juga dipasang.

Namun, jika Anda hanya pengguna akhir yang hanya ingin menginstal paket untuk menggunakannya, Anda akan melakukannya dari direktori mana pun:

npm install "$package"

Dalam hal ini, Anda biasanya tidak menginginkan ketergantungan pengembangan, jadi 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 konfigurasi untuk true, mungkin dari baris perintah sebagai:

npm install "$package" --dev

Pilihannya adalah false secara default karena ini adalah kasus yang kurang umum.

peerDependencies

(diuji sebelum 3.0)

Sumber: https://nodejs.org/en/blog/npm/peer-dependencies/

Dengan dependensi reguler, Anda dapat memiliki beberapa versi ketergantungan: itu hanya dipasang di dalam node_modulesdari ketergantungan.

Misalnya. jika dependency1 dan dependency2 keduanya bergantung pada dependency3 pada berbagai versi pohon proyek akan terlihat seperti:

root/node_modules/
                 |
                 +- dependency1/node_modules/
                 |                          |
                 |                          +- dependency3 v1.0/
                 |
                 |
                 +- dependency2/node_modules/
                                            |
                                            +- dependency3 v2.0/

Namun plugin adalah paket yang biasanya tidak memerlukan paket lain, yang disebut tuan rumah dalam hal ini. Sebagai gantinya:

  • plugin diperlukan oleh tuan rumah
  • plugin menawarkan antarmuka standar yang diharapkan oleh host
  • hanya host yang akan dipanggil langsung oleh pengguna, jadi harus ada versi tunggal dari itu.

Misalnya. jika dependency1 dan dependency2 rekan bergantung pada dependency3, pohon proyek akan terlihat seperti:

root/node_modules/
                 |
                 +- dependency1/
                 |
                 +- dependency2/
                 |
                 +- dependency3 v1.0/

Ini terjadi meskipun Anda tidak pernah menyebutkannya dependency3 di dalam kamu package.json mengajukan.

Saya rasa ini adalah contoh dari Inversi Kontrol pola desain.

Contoh prototipikal dari ketergantungan teman sebaya adalah Grunt, host, dan plugin-nya.

Misalnya, pada plugin Grunt seperti https://github.com/gruntjs/grunt-contrib-uglify, Anda akan melihat bahwa:

  • grunt adalah peerDependency
  • satu-satunya require('grunt') dibawah tests/: itu tidak benar-benar digunakan oleh program.

Kemudian, ketika pengguna akan menggunakan plugin, ia secara implisit akan memerlukan plugin dari Gruntfile dengan menambahkan grunt.loadNpmTasks('grunt-contrib-uglify') garis, tapi itu grunt bahwa pengguna akan menghubungi secara langsung.

Ini tidak akan berfungsi jika setiap plugin membutuhkan versi Grunt yang berbeda.

Manual

Saya pikir dokter 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.

Baris kuncinya adalah:

Hal-hal ini akan diinstal ketika melakukan npm link atau npm install dari root paket, dan dapat dikelola seperti parameter konfigurasi npm lainnya. Lihat npm-config (7) untuk lebih lanjut tentang topik ini.

Dan kemudian di bawah npm-config (7) temukan dev:

Default: false
Type: Boolean

Install dev-dependencies along with packages.

1739
2018-02-25 04:25



Jika Anda tidak ingin menginstal devDependencies yang dapat Anda gunakan npm install --production 


361
2017-07-05 10:06



Sebagai contoh, mocha biasanya akan menjadi devDependency, karena pengujian tidak diperlukan dalam produksi, sementara ekspres akan menjadi ketergantungan.


91
2017-09-18 18:39



Untuk menyimpan paket ke package.json sebagai dependensi dev:

npm install "$package" --save-dev

Saat Anda berlari npm install itu akan menginstal keduanya devDependencies dan dependencies. Untuk menghindari pemasangan devDependencies menjalankan:

npm install --production

48
2018-01-08 06:41



Ada beberapa modul dan paket yang hanya diperlukan untuk pengembangan, yang tidak diperlukan dalam produksi. Seperti dikatakan di dalam dokumentasi:

Jika seseorang berencana mengunduh dan menggunakan modul Anda dalam program mereka, maka mereka mungkin tidak ingin atau perlu mengunduh dan membangun kerangka uji atau dokumentasi eksternal yang Anda gunakan. Dalam hal ini, sebaiknya cantumkan item tambahan ini dalam hash devDependencies.


29
2017-09-18 14:59



ketergantungan
Dependensi yang perlu dijalankan proyek Anda, seperti pustaka yang menyediakan fungsi yang Anda panggil dari kode Anda.
Mereka dipasang secara transitif (jika A bergantung pada B tergantung pada C, instalasi npm pada A akan menginstal B dan C).
Contoh: lodash: proyek Anda memanggil beberapa fungsi lodash.

devDependencies
Dependensi Anda hanya perlu selama pengembangan atau rilis, seperti kompiler yang mengambil kode Anda dan mengkompilasinya ke javascript, kerangka uji atau generator dokumentasi.
Mereka tidak diinstal secara transitif (jika A bergantung pada B dev-tergantung pada C, instalasi npm pada A akan menginstal B saja).
Contoh: dengkur: proyek Anda menggunakan grunt untuk membangun dirinya sendiri.

peerDependencies
Dependensi yang proyek Anda kaitkan, atau modifikasi, dalam proyek induk, biasanya sebuah plugin untuk beberapa perpustakaan atau alat lain. Ini hanya dimaksudkan sebagai pemeriksaan, memastikan bahwa proyek induk (proyek yang akan bergantung pada proyek Anda) memiliki ketergantungan pada proyek yang Anda kaitkan. Jadi jika Anda membuat plugin C yang menambahkan fungsionalitas ke pustaka B, maka seseorang yang membuat proyek A akan perlu memiliki ketergantungan pada B jika mereka memiliki ketergantungan pada C.
Mereka tidak diinstal (kecuali npm <3), mereka hanya diperiksa.
Contoh: dengkur: proyek Anda menambahkan fungsi untuk mendengus dan hanya dapat digunakan pada proyek yang menggunakan grunt.

Dokumentasi ini menjelaskan ketergantungan teman sebaya dengan sangat baik: https://nodejs.org/en/blog/npm/peer-dependencies/ 

Juga, dokumentasi npm telah ditingkatkan dari waktu ke waktu, dan sekarang memiliki penjelasan yang lebih baik tentang berbagai jenis dependensi: https://github.com/npm/npm/blob/master/doc/files/package.json.md#devdependencies


18
2017-09-05 17:27



Penjelasan sederhana yang membuatnya lebih jelas bagi saya adalah:

Saat Anda menerapkan aplikasi, modul dalam dependensi harus dipasang atau aplikasi Anda tidak berfungsi. Modul dalam devDependencies tidak perlu diinstal pada server produksi karena Anda tidak mengembangkan pada mesin itu. link


8
2017-09-29 15:36



Saya ingin menambahkan jawaban atas pandangan saya tentang penjelasan ketergantungan ini

  • dependencies digunakan untuk penggunaan langsung dalam basis kode Anda, hal-hal yang biasanya berakhir dalam kode produksi, atau potongan kode
  • devDependencies digunakan untuk proses pembangunan, alat yang membantu Anda mengelola bagaimana kode akhir akan berakhir, modul pengujian pihak ketiga, (contohnya barang webpack)

6
2018-02-16 11:40



Ketika mencoba untuk mendistribusikan paket npm Anda harus menghindari penggunaan dependencies. Sebaliknya, Anda perlu mempertimbangkan untuk menambahkannya peerDependencies atau menghapusnya dari dependencies.


0
2017-07-06 12:47