2012-03-16 14 views
26

Mam prostą aplikację węzła, która ma jedną zależność od innej aplikacji na github. Zależność instaluje się dobrze z npm install, ale kiedy próbuję wymagać zainstalowania tam czegoś, mówi, że nie jest dostępna. Na przykład aplikacja github instaluje Mongoose jako zależność. Myślałem, że ta aplikacja rodzic będzie mógł uzyskać dostęp do tego modułu, ponieważ jest u dziecka:Wymaganie zależności od innej zależności w modułach węzłów

var mongoose = require('mongoose') 

Struktura wygląda mniej więcej tak:

/app 
    /node_modules 
    /github_dependency [parent module] 
     /node_modules 
     /mongoose [child module] 

mogę po prostu trzeba to mongoose postaci zależności w aplikacji nadrzędnej lub czy istnieje sposób na uzyskanie dostępu do tego modułu przez dziecko?

Odpowiedz

30

Czy muszę po prostu włączyć mangustę jako zależność w aplikacji nadrzędnej lub czy istnieje sposób na uzyskanie dostępu do tego modułu przez dziecko?

Chociaż to możliwie, aby na przykład require('github/node_modules/mongoose'), standardową praktyką jest jawne instalowanie wszystkich zależności (tzn. Należy uwzględnić mangustę jako zależność od aplikacji) i require('mongoose').

+1

Dziękuję, my” Postępuj zgodnie z tą konwencją. Jedną z rzeczy, o której chciałbym wspomnieć, jest to, że teoretycznie może to doprowadzić do wielu powielonych zależności w projekcie? –

+0

Może, a zazwyczaj będziesz miał kilka instancji kilku różnych modułów (i ich wersji) w projekcie węzła. To jedna z mocnych stron IMO, która spędziła sporą część wypracowanych przez nas "załamań" w ładowarkach klas różnych kontenerów Javy ... –

+4

Jest bardzo dobry powód, aby korzystać z tej techniki. Jeśli potrzebujesz ("github/node_modules/mangusta"), używasz tego samego wystąpienia mangusty, którego używa github, więc udostępniasz swoją pulę połączeń. Ta technika jest również przydatna, aby upewnić się, że używasz tych samych wersji. –

2

Dla bardziej wytrzymałą walizkę, co jest dobre w sytuacjach takich jak badania, można użyć następujących funkcji:

var Module = require('module'); 
var path = require('path'); 

function requireFrom(self, parent, name) { 
    var pPath = Module._resolveFilename(parent, self); 
    var m = new Module(pPath, module); 
    m.filename = pPath; 
    m.paths = Module._nodeModulePaths(path.dirname(pPath)); 
    return m.require(name); 
} 

, które mogą być wykorzystywane jako

requireFrom(module, 'github_dependency', 'mongoose')