Bagaimana saya bisa membuat beberapa proyek berbagi direktori node_modules?

95

Setiap kali saya membuat proyek, saya harus mengunduh semua dependensi modul node. Tanpa menyalin node_modules, Apakah ada cara untuk membagikan node_modules pusat di beberapa proyek?

seperti berikut ini, saya harus menjalankan banyak perintah setiap saat ..

npm install gulp-usemin                                                                        
npm install gulp-wrap
npm install gulp-connect
npm install gulp-watch
npm install gulp-minify-css
npm install gulp-uglify
npm install gulp-concat
npm install gulp-less
npm install gulp-rename
npm install gulp-minify-html
verystrongjoe
sumber
3
Anda dapat menginstalnya di direktori induk umum, jika ada. Node akan berjalan ke atas direktori mencari requiremodul d. Jika tidak, tidak, tidak ada node_modulesfolder "pusat" resmi untuk digunakan dengan require().
Jonathan Lonowski
Anda dapat menginstal paket ini secara global dengan menggunakan bendera global. Jadi Anda tidak perlu menjalankan perintah install setiap saat. npm install <npm_package_name> -g
Saba Hassan

Jawaban:

90

Anda benar-benar dapat membagikan direktori node_modules di antara proyek.

Dari dokumentasi node :

Jika pengenal modul yang diteruskan ke require () bukanlah modul asli, dan tidak dimulai dengan '/', '../', atau './', maka node dimulai pada direktori induk dari modul saat ini, dan ditambahkan / node_modules, dan mencoba memuat modul dari lokasi itu.

Jika tidak ditemukan di sana, maka ia akan pindah ke direktori induk, dan seterusnya, hingga root sistem file tercapai.

Misalnya, jika file di '/home/ry/projects/foo.js' disebut require ('bar.js'), node akan mencari di lokasi berikut, dalam urutan ini:

/home/ry/projects/node_modules/bar.js /home/ry/node_modules/bar.js /home/node_modules/bar.js /node_modules/bar.js

Jadi letakkan saja folder node_modules di dalam direktori proyek Anda dan masukkan modul apa pun yang Anda inginkan. Hanya membutuhkannya seperti biasa. Ketika node tidak menemukan direktori node_modules di folder proyek Anda, itu akan memeriksa folder induk secara otomatis. Jadi buat struktur direktori Anda seperti ini:

-myProjects
--node_modules
--myproject1
---sub-project
--myproject2

Jadi seperti ini, bahkan dependensi subproyek Anda dapat menggambar di repositori node_modules utama Anda.

Satu kelemahan untuk melakukannya dengan cara ini adalah Anda harus membuat file package.json Anda secara manual (kecuali seseorang tahu cara untuk mengotomatiskannya dengan grunt atau sesuatu). Ketika Anda menginstal paket Anda dan menambahkan --save arg ke sebuah npm installperintah, secara otomatis menambahkannya ke bagian dependensi atau package.json Anda, yang sesuai.

tpie
sumber
3
Mengapa ini tidak diterima sebagai op jawaban? Pertanyaan lebih lanjut ke @tpie, haruskah seseorang menyusun proyek seperti yang Anda sarankan, bagaimana cara membangun package.json untuk diinstal dari repositori modul induk.
diehell
@diehell Jadi tampaknya "semua atau tidak sama sekali". Jika semua atau dependensi berada di direktori induk dan tidak ada direktori node_modules di CWD maka npm akan memeriksa induknya dan menginstalnya di sana jika menemukannya. Jika Anda meletakkan folder node_modules di direktori, itu akan dipasang di sana.
tpie
4
Saya tidak melihat bagaimana berbagi node_modules dapat menangani versi paket yang berbeda, paket di node_modules tidak diversi, tidak seperti npm-cache di c: \ users (Windows), apakah ada yang mengalaminya?
maya
Bagaimana cara mengubah paradigma saya saat menulis skrip npm, dan file package.json?
Maddocks
18

Saya menemukan satu trik, lihat saja Symbolic Links (symlink) di Windows atau Linux , berfungsi seperti pintas tetapi lebih kuat.

Cukup Anda perlu membuat Junctionuntuk Anda node_modulesdi mana saja folder yang Anda inginkan. Persimpangan tidak lain adalah jalan pintas ke folder node_modules asli Anda. Buat di dalam folder proyek Anda di mana node_modules sebenarnya akan dibuat jika digunakan npm install.

Untuk mencapai ini, Anda memerlukan setidaknya satu node_modulesfolder nyata kemudian membuat Persimpangan di proyek lain.

Di Windows, Anda dapat menggunakan Command Prompt, atau menggunakan aplikasi. Menggunakan Command Prompt memberi Anda sedikit lebih banyak kontrol, menggunakan aplikasi lebih mudah saya sarankan Link Shell Extension .

Eymen Elkum
sumber
1
Saya cd dengan target dir, jalankan perintah ini: mklink /d node_modules (source dir)\node_modules.
ChrisTorng
1
Tim saya telah menggunakan metode ini selama beberapa waktu sekarang. Meskipun saya benar-benar benci tidak memiliki node_modulesfolder proyek itu sendiri, ini berfungsi. Hanya harus ingat untuk menelusuri node_modulesfolder sebenarnya sebelum menginstal sesuatu yang baru: P
Andrew Craswell
Metode ini sepertinya tidak berhasil untuk saya. Ketika saya menggunakan simbolik atau persimpangan, saya mendapatkan kesalahan berikut dengan node-sass: Pembuatan modul gagal: "Kesalahan: Modul tidak mendaftar sendiri" dan kesalahan tersebut memiliki detail lebih lanjut yang menentukan direktori tempat direktori "bersama" node_modules berada. Ada ide?
flipcode
1
Bagaimana cara menghindari pemangkasan ketergantungan saat berjalan npm installdi salah satu aplikasi "terhubung"?
Qwerty
1
tetapi ketika saya menjalankan npm install <new-package>semua paket yang tidak ada dalam proyek package.json Anda saat ini dihapus.
Rohit Kaushal
17

Coba pnpm daripada npm.

pnpm menggunakan hard link dan symlink untuk menyimpan satu versi modul hanya sekali pada disk.

Instal dengan:

npm install -g pnpm

Untuk memperbarui instalasi (dan sub-direktori) yang ada, gunakan:

pnpm recursive install
Benson
sumber
8

Direktori utama akan terlihat seperti ini

node_modules
Project 1
Project 2
Project 3
Project 4

buka saja file tersebut Project 1/.angular-cli.json

ubah skema

"$schema": "./node_modules/@angular/cli/lib/config/schema.json",

untuk

"$schema": "./../node_modules/@angular/cli/lib/config/schema.json"

dan jangan lupa untuk membuat node_modulesfolder kosong di dalam direktori proyek Anda

Shahzad Seraj
sumber
Kamu adalah pahlawanku. Saya telah menghabiskan waktu seminggu untuk ini. Terima kasih banyak!!
Eliezer Berlin
5

Dengan melihat beberapa artikel, tampaknya Lerna adalah alat yang bagus untuk mengelola banyak proyek di dalam satu direktori ( monorepo). Ini mendukung berbagi modul tanpa menduplikasi seluruh paket di setiap folder dan perintah untuk menginstalnya di banyak proyek.

pnpm juga merupakan alat yang sederhana dan efisien, yang tidak menduplikasi modul-modul yang sudah diinstal untuk proyek lain.

Chris
sumber
0

Mari kita asumsikan bahwa memiliki satu node_modules itu harus berisi semua paket untuk semua aplikasi. jadi aplikasi Anda juga akan membagikan sebagian besar entri package.json yang unik (hanya namanya yang harus berubah)

ide saya adalah memiliki satu root dan beberapa tingkat src seperti di bawah ini

root\package.json
root\node_modules
root\\..
root\app1\src\\..
root\app2\src\\..

satu-satunya masalah yang mungkin Anda hadapi adalah memiliki cadangan json (atau tsconfig) untuk aplikasi apa pun dan memulihkannya saat Anda mengerjakannya atau menyiapkan skrip startup Anda untuk melayani aplikasi apa pun

Fabio Guerrazzi
sumber