Düğümde genel modülleri nasıl alabilirim? “Hata: <modül> modülü bulunamadı” mesajı alıyorum?


145

Mac OSX Lion üzerinde Node kurmaya çalışıyorum. Her şey yolunda gibi görünüyor, ancak global modüller klasörümden herhangi bir modül ithal edemiyorum. Hatayı alıyorum,

Error: Cannot find module <module>

Bunu çalıştırırsam:, node -e require.pathsaldığım yanıt:

[ '/usr/local/lib/node_modules',
  '/Users/Me/.node_modules',
  '/Users/Me/.node_libraries',
  '/usr/local/Cellar/node/0.4.12/lib/node' ]

Bu doğru, benim modüllerim gerçekten / usr / local / lib / node_modules içine kurulur. Bir komut dosyası çalıştırmayı denediğimde, bunu alıyorum:

Error: Cannot find module 'socket.io'
    at Function._resolveFilename (module.js:326:11)
    at Function._load (module.js:271:25)
    at require (module.js:355:19)
    at Object.<anonymous> (/Users/Me/node/server.js:2:10)
    at Module._compile (module.js:411:26)
    at Object..js (module.js:417:10)
    at Module.load (module.js:343:31)
    at Function._load (module.js:302:12)
    at Array.<anonymous> (module.js:430:10)
    at EventEmitter._tickCallback (node.js:126:26)

.Bash_profile'm şöyle görünüyor:

export PATH=/usr/local/mysql/bin:$PATH
export NODE_PATH=/usr/local/lib/node_modules
export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:/usr/local/mysql/lib/"

Bazı yardımları gerçekten takdir ediyorum, neden herhangi bir kütüphaneyi içe aktaramayacağımı bilmiyorum.


1
Bunun tam olarak bir şeyler yapmanın tercih edilen yolu olmadığını biliyorsunuz, değil mi?
thejh

1
Detaylandırabilir misiniz? Yani genel klasöre kütüphaneler kurmamam gerekiyor mu?
Hanpan

3
@Hanpan: Tercih edilen yol, request () aracılığıyla kullanmak istediğiniz modülleri yerel olarak kurmaktır.
thejh

1
Daha iyi ve daha güncel bir cevap (güvenilmez npm link) burada bulunabilir: stackoverflow.com/a/15646750/2671392
GGG

1
Ben eski okulum ve küresel konumlara kütüphane kurmaya alışkınım. Yerel kütüphane kurulumlarının yoğun kullanımı için hiç ikna edici bir neden görmedim. Aldığım mongodb sınıfı, bitirdiğimizde yüz küçük projeye yakın bir yerde sona erecek, her biri çoğunlukla yinelenen kütüphaneler - mongodb, ekspres, konsolide vb. her yerde yerel kütüphaneler. Yerel Scala depolarında binlerce Scala kütüphanesi olmalı. Ditto Meteor, harika ve yakut.
Stephen W. Wright

Yanıtlar:


116

Npm> = 1.0 kullanıyorsanız, npm link <global-package>global olarak kurulu bir pakete yerel bir bağlantı oluşturmak için kullanabilirsiniz . ( Uyarı: İşletim sistemi sembolik bağlantıları desteklemelidir. )

Ancak, bu onun sorunları olmadan gelmez.

npm bağlantısı bir geliştirme aracıdır. Bu var müthiş yerel geliştirme kutuyu paketleri yönetmek için. Ancak npm bağlantısı ile dağıtmak temelde sorun istiyor, çünkü farkında olmadan şeyleri güncellemeyi süper kolaylaştırıyor.

Alternatif olarak, paketleri hem yerel hem de küresel olarak yükleyebilirsiniz.

Ek bilgi için bkz.


69
Bunu okuyorum ve gözlerime inanamıyorum. Yani, ekspres kurup ekspres üzerine inşa edecek 20 projem varsa, her biri için her proje klasörüne tekrar tekrar 20 kez yüklemem gerekir mi? Paket yöneticileriyle pek tecrübem yok ama bu çok berbat ...
treznik

25
Bu doğru ve bunu düşünürseniz, mantıklı. Bağımlılıklarınızı yerel olarak yönetmek, her şeyi kendi içinde tutar ve herhangi bir proje için bağımlılığın belirli bir sürümünü belirtmenizi sağlar (örn. Proje foo, ekspres 2.x gerektirir, ancak proje çubuğu ekspres 3 beta'yı kullanabilir).
grahamb

43
Bunun mantığını bir süre anlamaya çalıştım, ama Ruby arkadaşlarımın küresel paket güncellemeleriyle mücadele ettiklerini izledikten sonra, değerli taşlar hakkında tartıştık ve çoğu zaman asla yükseltme yapmadım, bağımlılıkları yerel olarak kurmanın kesinlikle tek akıllıca yol olduğunu kabul ettim. paket yönetimi .
timoxley

3
Bu durum ile yazılımın dağıtımı ile ilgili olarak statik bağlantı ile dinamik bağlantı kitaplıklarının durumu arasında bir paralel çizmek istiyorum. İOS App Store'da dağıtılan hemen hemen tüm Uygulamaların, iOS SDK tarafından sağlanmayan bağımlılıkları statik olarak bağlaması gerektiğini unutmayın. Bu neden yapılır? Küresel bağımlılık cehennemi çok gerçek bir şey.
Steven Lu

1
Aynı zamanda, npmönbelleğin (içinde yaşayan ~/.npm), farklı konumlarınızda gerçekleştirilen yeniden yükleme işlemini uygun hale getireceğine inanıyorum.
Steven Lu

86

Node.js NODE_PATH, modül arama yoluna eklenecek ek dizinleri belirtmek için çevre değişkenini kullanır . npmKomutla global modüllerin nerede depolandığını söylemek için kendisini kullanabilirsiniz npm root -g. Bu ikisini bir araya getirerek, global modüllerin aşağıdaki komutla arama yolunuza dahil edildiğinden emin olabilirsiniz (Linux-ish'de)

export NODE_PATH=$(npm root --quiet -g)


3
NODE_PATHOrtam değişkeni ipucu için teşekkürler . Bu çok yardımcı oldu!
rekire

7
Bu en iyi yorum olmalı
Adam Prax

NODE_PATHMSMS2 üzerinde npm çalışması yapmak için eşdeğer posix yolu ayarlamak zorunda kaldı . Teşekkür ederim.
Joyce Babu

Windows ve Git bash ile de çalışır. Mükemmel. :-)
inf3rno

Bu, .node_modulesklasörünüzü aranabilir hale getirir , ancak modülleri kullanarak içe aktarmak için require(), yine de yerel proje dizininize kurulmalıdır (veya alternatif olarak, kullanılarak bağlanır npm link). Global modüller projelerde içe aktarılamaz, yalnızca ikili dosyalar / komut dosyaları oradan çalıştırılabilir.
Prahlad Yeri

65

Npm bağlantısını, projeler klasörünüzdeki global paketinize sembolik bir bağlantı oluşturmak için kullanabilirsiniz.

Misal:

$ npm install -g express
$ cd [local path]/project
$ npm link express

Tek yaptığı bir yerel node_modules klasörü oluşturmak ve sonra bir symlink express -> [global dizin] / node_modules / express oluşturmaktır. require('express')


Bu çapraz işletim sistemi uyumlu mu?
UpTheCreek

Windows'un daha yeni sürümleri bu sürümden bu yana destekliyor: github.com/npm/npm/commit/… Daha eski Windows sürümleri için npmjs.com/package/npm-junction adresini
Alex

22

Herhangi bir paketi global olarak aşağıdaki gibi yükleyin:

$ npm install -g replace  // replace is one of the node module.

Bu değiştirme modülü genel olarak kurulduğundan, düğüm modülleri klasörünüzü görürseniz, orada değiştirme modülünü göremezsiniz ve bu nedenle, requirment ('replace') kullanarak bu paketi kullanamazsınız.

çünkü zorunlu olarak yalnızca düğüm modülü klasörünüzde bulunan yerel modülleri kullanabilirsiniz.

Şimdi global modülü kullanmak için aşağıdaki komutu kullanarak onu düğüm modülü yolu ile bağlamanız gerekir.

$ npm link replace

Şimdi geri dönün ve düğüm modül klasörünüze bakın, artık modül değiştirmeyi görebiliyorsunuz ve yerel düğüm modülünüze bağlı olduğundan uygulamanızda requir ('replace') ile kullanabilirsiniz.

Pls daha fazla açıklama gerekiyorsa bana bildirin.


14

Genel modül dizininin yolundaki argümanını argüman olarak kullanabilirsiniz.

require('/path/to/global/node_modules/the_module');

Mac bilgisayarımda şunu kullanıyorum:

require('/usr/local/lib/node_modules/the_module');

Global modüllerinizin yerini nasıl bulabilirim? -> npm paketleri nereye kurar?


7

NODE_PATH ortam değişkenini genel node_modulesklasörünüzü gösterecek şekilde ayarlama .

Windows 7 veya sonraki sürümlerde yol, UNIX'teki gibi bir şey %AppData%\npm\node_modulesolabilir, /home/sg/.npm_global/lib/node_modules/ancak kullanıcı yapılandırmasına bağlıdır.

Komut npm config get prefixhangisinin doğru yol olduğunu bulmaya yardımcı olabilir.

UNIX sistemlerinde bu komutu aşağıdaki komutla gerçekleştirebilirsiniz:

export NODE_PATH=`npm config get prefix`/lib/node_modules/

0

Docker kullanıyorum. Tüm düğüm bağımlılıkları yüklü, ancak (bir node_modules dizin veya bağlantı ile kirletmeden) konteyner çalışma zamanında benim yerel uygulama dizini kullanabilirsiniz bir docker görüntü oluşturmaya çalışıyorum. Bu, bu senaryoda sorunlara neden olur. Benim geçici çözüm, modülün tam olarak gerekli olduğu yoldan istemektir, örn. ('/ Usr / local / lib / node_modules / socket.io')


-1

require.paths kullanımdan kaldırıldı.

Proje klasörünüze gidin ve yazın

npm install socket.io

bunu düğümün arayacağı yerel ./node_modules klasörüne yüklemelidir.

Eşyalarımı şöyle saklıyorum:

cd ~/Sites/
mkdir sweetnodeproject
cd sweetnodeproject
npm install socket.io

Bir app.js dosyası oluşturun

// app.js
var socket = require('socket.io')

şimdi uygulamamı çalıştır

node app.js

Kullandığınızdan emin olun npm >= 1.0ve node >= 4.0.


8
Global olarak kurulmuş npm paketlerini kullanmayı soruyor.
UpTheCreek

@Jamund. Yerel olarak yüklenen paketi nasıl kullanacağınızı gösteriyorsunuz, ancak orijinal soru küresel olanlarla ilgili.
Vitaliy Markitanov
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.