Saya punya pertanyaan serupa dengan ini , tetapi tidak persis sama.
Saya ingin agar pengguna aplikasi saya menginstalnya dengan dependensi apa pun yang diperlukan untuk cara dia ingin menggunakannya. Jadi, misalnya, jika mereka ingin tetap menggunakan MongoDB, maka hanya perpustakaan yang berhubungan dengan Mongo yang akan diinstal, tetapi jika mereka ingin tetap menggunakan Redis, maka hanya perpustakaan yang terkait dengan Redis yang akan diinstal. Saya tidak ingin membuat mereka mengunduh dan menginstal perpustakaan yang tidak akan mereka gunakan.
Saya tahu saya bisa melakukan itu untuk tujuan pengembangan devDependencies
, tetapi ini lebih jauh dari itu. Seperti jawaban dalam pertanyaan di atas, ini lebih terkait dengan profil Python setuptools
extras_require
dan Clojure leiningen
. Ada yang seperti itu di npm? Saya benar-benar merasa devDependencies
harus menjadi dev
profil cara yang lebih fleksibel untuk menentukan dependensi.
sumber
MyPackage-Core
MyPackage-Db-Mongo
MyPackage-Db-Redis
dll ... banyak cara orang melakukan modul bower yang dimaksudkan untuk memperpanjang sudut .package.json
yang telah diselesaikan di manajer paket lain.Jawaban:
The Modul codependency mungkin apa yang Anda cari, atau apa pun yang melakukan sesuatu yang mirip dengan:
package.json
yang tidak diinstal secara otomatis olehnpm install
, katakanlahoptionalPeerDependencies
require
fungsi gaya- kustom yang mengetahuioptionalPeerDependencies
dan melakukan hal yang benar, termasuk melempar / memperingatkan ketika tidak ada yang memenuhi kelas modul yang diperlukan (mis. tidakredis
, ataumongo
, ataumysql
, dll. dipasang).Salah satu variasi adalah jika fungsionalitas inti modul bekerja tanpa dependensi opsional (misalnya pola plugin), tidak ada kesalahan / peringatan ketika tidak ada yang ditemukan yang memenuhi dependensi rekan.
Variasi lain adalah melakukan daftar di atas sambil menghitung ketergantungan produksi versus pengembangan, yaitu analog untuk
dependencies
dandevDependencies
.Mungkin dikombinasikan dengan permintaan sesuai permintaan sehingga modul opsional diperlukan dengan malas, misalnya:
sumber
codependency
disediakan modul jika modul menguap dari NPM dan karena tautan tanpa kutipan adalah bentuk SO yang buruk.Jika Anda ingin dependensi opsional sederhana seperti plugins, mis. Jika Anda menginstal foo Anda akan menjalankannya berwarna-warni tetapi jika tidak diinstal, Anda tidak memiliki masalah dan melihatnya dalam warna abu-abu, maka Anda dapat menggunakan dependensi dependen opsional dalam package.json :
Dan dalam kode:
Diambil dari dokumentasi package.json .
sumber
Apa yang saya lakukan adalah mengkonfigurasi skrip instalasi di package.json saya, di dalam
scripts
, seperti ini:Ini akan berjalan setelah
npm install
selesai. Saya menggunakannya sebagian besar untuk menghasilkan.env
file secara otomatis dengan default.The
my-install.js
Script bisa menjalankan perintah yang berbeda, membuat file, meminta input pengguna, jadi Anda bisa mengatakan "Ingin Redis atau Mongo?":Ini adalah jawaban yang sangat cepat, periksa readline untuk membaca input pengguna dengan benar dan proses anak untuk menjalankan perintah dan memproses output, dll.
Perhatikan juga bahwa skrip instal bisa apa saja yang Anda inginkan (python, bash, dll)
sumber
npm install
kembali di dalam skrip instal juga dapat memicu perilaku yang tidak diinginkan. Saya tidak merekomendasikan solusi ini.npm benar-benar tidak dirancang untuk ini, karena salah satu bagian tersulit dari manajemen dependensi adalah memastikan pembangunan yang cepat dan dapat direproduksi yang mudah dan relatif gagal. Tapi saya percaya ada use case, dan pasti ada untuk saya. Jadi saya menulis paket untuk melakukan persis apa yang Anda minta.
Paket saya adalah
install-subset
, dan dapat diinstal secara global dengannpm install -g install-subset
https://www.npmjs.com/package/install-sset
Pertama, Anda membuat daftar putih dan daftar hitam untuk subset instalasi bernama di package.json Anda seperti ini:
Kemudian sebut dengan, misalnya,
install-subset test
Ini untuk sementara akan menulis ulang package.json Anda agar tidak menginstal paket-paket tersebut dalam daftar hitam, kemudian mengembalikannya, yang tergantung pada paket-paketnya dapat menghemat banyak waktu dan bandwidth.
Juga bekerja dengan benang, bersifat open source dan masalah / PR disambut.
Dalam banyak kasus, saya menggunakan ini di server ci kami untuk menurunkan waktu pembuatan, dan pada proyek React Native terbaru kami, membuat pemasangan pengembang baru khas kami dari 72 detik menjadi sekitar 20 detik.
sumber