Package.json içinde yerel bağımlılık


453

Öyle, böyle bir şey yapmak istiyorum npm installda yükler package.jsonarasında ../somelocallibbağımlılıklarından veya daha da önemlisi.

"dependencies": {
    "express": "*",
    "../somelocallib": "*"
}

Yanıtlar:


583

npm> = 2.0.0

Bu özellik, npm'nin 2.0.0 sürümünde uygulanmıştır . Misal:

{
  "name": "baz",
  "dependencies": {
    "bar": "file:../foo/bar"
  }
}

Aşağıdaki yollardan herhangi biri de geçerlidir:

../foo/bar
~/foo/bar
./foo/bar
/foo/bar

Yerel paket olacaktır kopyalanan için önek (./node-modules ).

npm <2.0.0

Normalde somelocallibbağımlılık olarak koyun package.json:

"dependencies": {
  "somelocallib": "0.0.x"
}

Ardından run npm link ../somelocallibve npm, üzerinde çalıştığınız sürümü bir sembolik bağlantı olarak yükleyecektir .

app@0.0.1 /private/tmp/app
└── somelocallib@0.0.1 -> /private/tmp/somelocallib

Referans: bağlantı (1)


3
Nasıl kaldırabiliriz?
AtaurRehman Asad

13
Yerel paketleri "npm bağlantısı" ile kurmanın dezavantajı, çok sayıda modül çoğaltma almanızdır. Bağımlılıklarınızı "module: version" veya "module: git-repo" ile listelediğinizde, npm install algoritması, bir üst pakete önceden yüklenmiş bir paketi yüklemekten kaçınır. Yani "npm bağlantısı" ile, ana uygulamanız "async@0.8.0" a bağlıysa ve tüm yerel paketleriniz de "async@0.8.0" a bağlıysa, "async@0.8" i yükleyen tüm yerel paketlerle sonlanırsınız. Ana uygulamanın aynı "async" sürümünü kullanmak yerine 0 ". Bu "npm yükleme klasörü" kullanılarak gerçekleşmez.
Pedro Ballesteros

3
@PedroBallesteros kullanabilirsiniz npm dedupbu sorunu gidermek için. npmjs.org/doc/cli/npm-dedupe.html
danilopopeye

4
"Yerel paket kopyalanacak ..." daha yeni bir npm sürümüyle böyle görünmüyor. Şimdi, bir sembolik bağlantı oluşturulur.
tsauerwein

2
@danilopopeye başına docs.npmjs.com/cli/install npm install <folder> açıklama diyor Paket projeye mevcut projede bir sembolik bağlantı olarak yükleyin.
Herman J. Radtke III

211

Artık package.jsondoğrudan yerel Düğüm modülü kurulum yollarını belirlemek mümkündür . Dokümanlardan:

Yerel Yollar

Sürüm 2.0.0'dan itibaren, paket içeren yerel bir dizine yol sağlayabilirsiniz. Yerel yollar npm install -Sveya aşağıdaki npm install --saveformlardan herhangi biri kullanılarak kaydedilebilir :

../foo/bar
~/foo/bar
./foo/bar
/foo/bar

bu durumda onlar göreli bir yol normalize edilecek ve ilave package.json. Örneğin:

{
  "name": "baz",
  "dependencies": {
    "bar": "file:../foo/bar"
  }
}

Bu özellik, yerel çevrimdışı geliştirme ve harici bir sunucuya çarpmak istemediğiniz yerlerde npm kurulumu gerektiren testler oluşturmak için yararlıdır, ancak paketleri genel kayıt defterine yayınlarken kullanılmamalıdır.


23
Npm v.3 + 'da normalleştirme göreceli değil mutlaktır , bu yüzden şöyle bir şey göreceksiniz"bar": "file:///home/user/src/foo/bar"
Ron Wertlen

27
Sürüm artışı olmadan yerel yol bağımlılığı nasıl güncelleştirilir?
Bohdan Lyzanets

3
Bu arada, standart node:onbuildgörüntüler yalnızca geçerli dizini kopyalayıp, böylece herhangi bir şeyi dışarıda bıraktığından, düğüm uygulamanızı dolaştırmaya çalıştığınızda ve / veya her türlü soruna neden olur ../foo.
donmartin

4
biri git + ssh ile entegre etmenin herhangi bir yolu var mı, böylece ya git deposunun yerel bir kopyası npm installya da LAN üzerindeki başka bir git deposuna sahip olabilir mi? Yukarıda ve npm install git + ssh denediğimde, node_modules dizinine bakmak ve üst düzey paketi nasıl yüklüyorum da git + ssh üzerinden gitmeye çalışmak gibi görünmüyor.
Michael

1
İş kurulumu. Ancak bu şekilde, modülü projeme aktarmaya çalışırken "ERR bulunamadı" iletisini alacağım.
C4d

87

Bu benim için çalışıyor.

Aşağıdakileri package.json dosyanıza yerleştirin

"scripts": {
    "preinstall": "npm install ../my-own-module/"
}

4
"Npm bağlantısı" kullanımını gerektirmeyen öneri için teşekkürler
ItalyPaleAle

.gitignoreModül klasöründe kaldırıldı , oluşturuldu .npmignoreve ilk çalıştırdığımda 777 dışında tüm klasörlere özyineli olarak uygulandı node_modules. Ama evet, bağımlılıkları kurdu. Npm 1.4.14 sürümünü kullanma.
L0LN1NJ4

Bunu kullandım, ancak node_modules ile uğraşmak yerine app_modules kullandım
catalint

1
Neden olmasın "dependencies": { "my-own-module": "file:../my-own-module" }?
Bohdan Lyzanets

1
Burada @Bohdan'a katılıyorum. local bağımlılıkları da aynı şeyi yapacaktır. Kullanmanın avantajı, bağımlılıklarınızı güncellemek için her seferinde npm linkyapmanız gerekmemesidir npm install.
froginvasion

30

Modülünüzü sürüm kontrolüne göre kontrol ettiğiniz ve npm bağlantısını hatırlayan geliştiricilere güvenmek istemediğiniz için bunu daha da otomatik hale getirmek istiyorsanız, bunu package.json "komut dosyaları" bölümüne ekleyebilirsiniz:

"scripts": {
    "postinstall": "npm link ../somelocallib",
    "postupdate": "npm link ../somelocallib"
  }

Bu kibirli olmanın ötesinde, ama "işliyor" gibi görünüyor. Bu npm sorunundan ipucu aldım: https://github.com/npm/npm/issues/1558#issuecomment-12444454


15
Neden postinstallve postupdateyerine preinstallve preupdate?
rightfold

1
Bunun ne yaptığını biraz daha açıklayabilir misiniz? yani birden çok kök klasörlü (yani "çok köklü çalışma alanı") bir vscode projesi kurarsam, tüketen projeler için modül klasöründeki değişiklikleri derhal yansıtabilecek mi? - Bu kesmek bununla mı ilgili?
bvdb

26

Yerel bağımlılıkları şu şekilde ekleyeceksiniz:

npm install file:src/assets/js/FILE_NAME

NPM'den package.json'a ekleyin:

npm install --save file:src/assets/js/FILE_NAME

Doğrudan böyle paket.json ekleyin:

....
  "angular2-autosize": "1.0.1",
  "angular2-text-mask": "8.0.2", 
  "animate.css": "3.5.2",
  "LIBRARY_NAME": "file:src/assets/js/FILE_NAME"
....

6

Ana proje

İşte ana proje için kullanacağınız package.json:

"dependencies": {
    "express": "*",
    "somelocallib": "file:./somelocallib"
}

Orada ./somelocallibkütüphane klasörüne referanstır ana proje package.json için orantılı bir şekilde .

Referans: https://docs.npmjs.com/files/package.json#local-paths


Alt proje

Kütüphane bağımlılıklarınızı yönetin.

Koşmaya ek olarak koşmanız npm installgerekecek (cd node_modules/somelocallib && npm install).

Bu, NPM'de bilinen bir hatadır.

Referans: https://github.com/npm/npm/issues/1341 (daha güncel bir referans arıyor)


Docker için notlar

Kaptanınızı package.lockve somelocallib/package.lockkaynak kod yöneticinizi kontrol edin.

Ardından Dockerfile dosyasında şunları kullanın:

FROM node:10
WORKDIR /app
# ...
COPY ./package.json ./package-lock.json ./
COPY somelocallib somelocallib
RUN npm ci
RUN (cd node_modules/zkp-utils/ && npm ci)
# ...

(cd A && B)İşlemlerimi yapmak için parantez kullanıyorum .


3

Bunun npm install ../somelocallibişe yaradığını biliyorum .

Ancak, soruda gösterdiğiniz sözdiziminin işe yarayıp yaramayacağını bilmiyorum package.json...

Ne yazık ki, doc URL'den yalnızca bağımlılık olarak bahsediyor gibi görünüyor.

file:///.../...tar.gzSıkıştırılmış bir yerel lib'i işaret etmeye çalışın ... ve çalışıp çalışmadığını bize bildirin.


1
Package.json'a "bağımlılıklar": {"somemodule": "file: ///./internal_modules/somemodule"} ekliyorum. Çalışmıyor. Hata kodu "npm ERR! Kodu E404" dür.
Jeffrey

2

Bu benim için çalıştı: ilk olarak, npm dizinlerinin doğru kullanıcıya sahip olduğundan emin olun

sudo chown -R myuser ~/.npm
sudo chown -R myuser /usr/local/lib/node_modules

Sonra paketinizdeki .json dizini bağlayın

"scripts": {
 "preinstall": "npm ln mylib ../../path/to/mylib"
}, 
"dependencies": {
  "mylib" : "*"
}

2
Windows üzerindeki sembolik bağlantılar XP en.wikipedia.org/wiki/NTFS_symbolic_link'ten beri mümkündür . Komut satırını yönetici olarak açın, ardından çalıştırın npm install.
sod

2

Aslında, npm 2.0 itibariyle, şimdi yerel yollar desteği var ( buraya bakın ).


8
Michael Trouw bu cevabı birkaç hafta önce vermişti, o zaman niye yineleniyor?
Dan Dascalescu

2

Meraklı ..... en azından Windows (benim npm 3. bir şey) Yapmam gereken:

"dependencies": {
 "body-parser": "^1.17.1",
 "module1": "../module1",
 "module2": "../module2",

Bunu yaptığımda npm install ../module1 --save, belgelere göre değil, mutlak yollarla sonuçlandı.

Biraz daha berbat ettim ve bunun ../xxxyeterli olduğunu belirledim .

Özellikle, yerel düğüm modülleri d: \ build \ nodeApp d: \ build \ module1, d: \ build \ module2 ve benim düğüm projesi (uygulama) demek için teslim aldım.

'Kurmak' için, ben:

d:\build\module1> rmdir "./node_modules" /q /s && npm install
d:\build\module2> rmdir "./node_modules" /q /s && npm install
d:\build\nodeApp> rmdir "./node_modules" /q /s && npm install

module1's package.json, "module2" bağımlılığına sahiptir: "../module2"; modül2'nin yerel bağımlılığı yoktur; nodeApp'ın "module1": "../module1" ve "module2": "../module2" bağımlılıkları vardır.

Tüm 3 klasör (modül1, modül2 ve nodeApp) aynı seviyede bulunduğundan bunun benim için çalışıp çalışmadığından emin değilim .......


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.