2012-03-16 18 views
26

Ho una semplice applicazione di nodo che ha una dipendenza singola su un'altra app su github. La dipendenza si installa perfettamente con npm install, ma quando provo a richiedere qualcosa installato lì, dice che non è disponibile. Ad esempio, l'applicazione github installa Mongoose come dipendenza. Ho pensato che questo app genitore sarebbe in grado di accedere a tale modulo dal momento che è in un bambino:Richiedere la dipendenza di un'altra dipendenza nei moduli di nodo

var mongoose = require('mongoose') 

La struttura sembra qualcosa di simile:

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

fare mi resta che includere mangusta come dipendenza anche nell'app genitore o c'è un modo per accedere a quel modulo tramite il bambino?

risposta

30

Devo solo includere la mangusta come dipendenza nell'app padre o c'è un modo per accedere a quel modulo tramite il bambino?

Mentre è possibile per voi per es. require('github/node_modules/mongoose'), lo studio standard prevede l'installazione di tutte le dipendenze in modo esplicito (ad esempio, è necessario includere mangusta come dipendenza dell'app) e require('mongoose').

+1

Grazie, noi' Seguirò questa convenzione. Una cosa che volevo menzionare, potrebbe teoricamente comportare dipendenze multiple e duplicate nel progetto? –

+0

Potrebbe e in genere si avranno diverse istanze di diversi moduli (e versioni di essi) in un progetto di nodo. Questo è uno dei punti di forza dell'nm IMO, dopo aver trascorso una considerevole parte degli anni '80 a elaborare dei nodi nei caricatori di classi di diversi contenitori Java ... –

+4

C'è una buona ragione per usare questa tecnica. Se si esegue una richiesta di ('github/node_modules/mongoose'), si sta utilizzando la stessa istanza di mangusta che github sta usando, quindi si condivide il suo pool di connessioni. Questa tecnica è anche utile per assicurarti di utilizzare le stesse versioni. –

2

Per un caso più robusto, che è buono in situazioni come i test, è possibile utilizzare la seguente funzione:

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); 
} 

che può essere utilizzato come segue

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