Birden çok projenin node_modules dizinini paylaşmasını nasıl sağlayabilirim?


94

Ne zaman proje yapsam, düğüm modüllerinin tüm bağımlılıklarını indirmem gerekiyor. Node_modules kopyalanmadan, merkezi node_modules birden fazla projede paylaşılacak bir şekilde var mı?

aşağıdaki gibi, her seferinde birçok komut çalıştırmam gerekiyor ..

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

3
Bunları varsa ortak bir ana dizine kurabilirsiniz. Düğüm , d modülünü arayan dizinlerde gezer require. Aksi takdirde, hayır, node_moduleskullanım için resmi bir "merkezi" klasör yoktur require().
Jonathan Lonowski

Global bayrağı kullanarak bu paketleri global olarak kurabilirsiniz. Böylece her seferinde yükleme komutlarını çalıştırmanıza gerek kalmaz. npm install <npm_package_name> -g
Saba Hassan

Yanıtlar:


90

Projeler arasında kesinlikle bir node_modules dizinini paylaşabilirsiniz.

Gönderen düğümün belgelerinde :

Require () 'ye iletilen modül tanımlayıcısı yerel bir modül değilse ve' / ',' ../ 'veya' ./ 'ile başlamıyorsa, düğüm geçerli modülün üst dizininde başlar ve ekler / node_modules ve modülü bu konumdan yüklemeye çalışır.

Orada bulunmazsa, dosya sisteminin köküne ulaşılana kadar üst dizine taşınır ve bu böyle devam eder.

Örneğin, '/home/ry/projects/foo.js' adresindeki dosya gerekli ('bar.js') olarak adlandırılırsa, düğüm aşağıdaki konumlara bu sırayla bakar:

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

Bu yüzden, projeler dizininizin içine bir node_modules klasörü koyun ve istediğiniz modülleri yerleştirin. Onları normal gibi isteyin. Node, proje klasörünüzde bir node_modules dizini bulamadığında, ana klasörü otomatik olarak kontrol edecektir. Öyleyse dizin yapınızı şu şekilde yapın:

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

Bu nedenle, alt projenizin bağımlılıkları bile ana node_modules deponuza dayanabilir.

Bunu bu şekilde yapmanın bir dezavantajı, package.json dosyanızı manuel olarak oluşturmanız gerekmesidir (biri bunu grunt veya başka bir şeyle otomatikleştirmenin bir yolunu bilmiyorsa). Paketlerinizi kurduğunuzda ve bir npm installkomuta --save argümanını eklediğinizde, bunu otomatik olarak bağımlılıklar bölümüne veya package.json dosyanıza ekler, bu da uygundur.


3
Bu neden bir cevap operasyonu olarak kabul edilmiyor? @Tpie'ye başka bir soru, önerdiğiniz gibi bir proje yapılandırılırsa, paket.json'u üst modül deposundan yüklemek için nasıl oluşturulur?
diehell

@diehell Yani "ya hepsi ya hiç" gibi görünüyor. Tüm veya bağımlılıklar bir üst dizinde yaşıyorsa ve CWD'de node_modules dizini yoksa, npm üst dizini kontrol eder ve bulursa oraya yükler. Dizine bir node_modules klasörü koyarsanız, oraya kurulacaktır.
tpie

4
Paylaşım düğüm_modüllerinin farklı paket sürümlerini nasıl işleyebileceğini anlamıyorum, node_modules içindeki paketler, c: \ users (Windows) içindeki npm-cache'den farklı olarak sürümlenmemiş, buna kimse rastladı mı?
cyberguest

Npm betikleri ve package.json dosyalarını yazarken paradigmamı nasıl değiştiririm?
Maddocks

18

Bir numara buldum, sadece Windows veya Linux'taki Sembolik Bağlantılara (sembolik bağlantılar) bir bakın, kısayollar gibi çalışıyor ama daha güçlü.

Basitçe bir yapmak gerekir Junctionsizin için node_modulesistediğiniz klasörü her yerde. Bağlantı, orijinal node_modules klasörünüze kısa bir yoldan başka bir şey değildir. Kullanılsaydı gerçek node_modules'in oluşturulacağı proje klasörünüzde oluşturun.npm install .

Bunu başarmak için en az bir node_modulesgerçek klasöre ihtiyacınız var, ardından diğer projelerde bir Junction yapın.

Windows'ta, Komut İstemi'ni kullanabilir veya bir uygulama kullanabilirsiniz. Komut İstemi'ni kullanmak size biraz daha fazla kontrol sağlar, bir uygulamayı kullanmak daha kolaydır Link Kabuğu Uzantısını öneririm .


1
Hedef dir ben cd, bu komutu çalıştırın: mklink /d node_modules (source dir)\node_modules.
ChrisTorng

1
Ekibim bir süredir bu yöntemi kullanıyor. node_modulesProje klasörünün kendisinde olmamasını gerçekten küçümsememe rağmen , bu işe yarıyor. node_modulesYeni bir şey yüklemeden önce gerçek klasöre göz atmayı unutmayın : P
Andrew Craswell

Bu yöntem benim için işe yaramıyor gibi görünüyor. Sembolik veya kavşakları kullandığımda, node-sass ile aşağıdaki hatayı alıyorum: Modül oluşturma başarısız oldu: "Hata: Modül kendi kendine kayıt olmadı" ve hata, "paylaşılan" düğüm_modülleri dizininin bulunduğu dizini belirten daha fazla ayrıntı içeriyor. Herhangi bir fikir?
18-18

1
npm install"Bağlı" uygulamalardan herhangi birinde çalışırken bağımlılık azalması nasıl önlenir?
Qwerty

1
ancak npm install <new-package>mevcut projenizin package.json dosyasında olmayan tüm paketleri çalıştırdığımda kaldırılıyor.
Rohit Kaushal

17

Npm yerine pnpm'yi deneyin .

pnpm, bir modülün bir sürümünü bir diske yalnızca bir kez kaydetmek için sabit bağlantıları ve sembolik bağlantıları kullanır.

Şununla yükle:

npm install -g pnpm

Mevcut kurulumlarınızı (ve alt dizinlerinizi) güncellemek için şunu kullanın:

pnpm recursive install

8

Ana dizin şöyle görünmeli

node_modules
Project 1
Project 2
Project 3
Project 4

sadece dosyayı aç Project 1/.angular-cli.json

şemayı değiştir

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

-e

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

ve node_modulesproje dizininizin içinde boş klasör oluşturmayı unutmayın


Kahramanımsın. Bunun için bir hafta geçirdim . Çok teşekkür ederim!!
Eliezer Berlin

5

Bazı makalelere bakarak Lerna'nın tek bir dizin ( monorepo) içindeki birden çok projeyi yönetmek için iyi bir araç olduğu görülmektedir . Her klasördeki tüm paketleri çoğaltmadan modül paylaşımını ve bunları birden çok projeye yüklemek için komutları destekler.

pnpm aynı zamanda basit ve verimli bir araçtır ve diğer projeler için halihazırda kurulu olan modülleri çoğaltmaz.


0

Tek bir node_modules'e sahip olmanın tüm uygulamalar için tüm paketleri içermesi gerektiğini varsayalım. böylece uygulamalarınız benzersiz package.json girişlerinin çoğunu paylaşacaktır (yalnızca ad değişmelidir)

benim fikrim aşağıdaki gibi tek bir kök ve çoklu src seviyesine sahip olmak olurdu

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

Karşılaşabileceğiniz tek sorun, herhangi bir uygulama için bir json (veya tsconfig) yedeğini almak ve üzerinde çalışırken bunları geri yüklemek veya herhangi bir uygulamaya hizmet etmek için başlangıç ​​komut dosyalarınızı kurmaktır.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.