2012-03-16 6 views
26

Tengo una aplicación de nodo simple que tiene una sola dependencia en otra aplicación en github. La dependencia se instala perfectamente con npm install, pero cuando intento solicitar algo allí instalado, dice que no está disponible. Por ejemplo, la aplicación github instala Mongoose como una dependencia. Pensé que esta aplicación padre sería capaz de acceder a ese módulo, ya que es en un niño:Requerir dependencia de otra dependencia en los módulos de nodo

var mongoose = require('mongoose') 

La estructura se ve algo como esto:

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

No sólo tengo que incluir mangosta como la dependencia también en la aplicación principal o ¿hay alguna manera de obtener acceso a ese módulo por medio del niño?

Respuesta

30

¿Tengo que incluir también a mangosta como una dependencia en la aplicación principal o hay una forma de obtener acceso a ese módulo por medio del niño?

Si bien es posible para que usted, p. require('github/node_modules/mongoose'), la práctica estándar es instalar todas sus dependencias explícitamente (es decir, debe incluir mangosta como una dependencia de su aplicación) y require('mongoose').

+1

Gracias, estamos Seguiré esta convención. Una cosa que sí quería mencionar, ¿podría esto teóricamente dar como resultado múltiples dependencias duplicadas en el proyecto? –

+0

Podría, y normalmente tendrá varias instancias de varios módulos diferentes (y su versión) en un proyecto de nodo. Esa es una de las fortalezas de npm IMO, después de haber pasado una parte considerable de los años '00 resolviendo fallas en los cargadores de clase de diferentes contenedores Java ... –

+4

Hay una muy buena razón para usar esta técnica. Si realiza una solicitud de ('github/node_modules/mongoose'), está utilizando la misma instancia de mangosta que github está usando, por lo que comparte su grupo de conexiones. Esta técnica también es útil para garantizar que estés utilizando las mismas versiones. –

2

Para un caso más robusto, lo cual es bueno en situaciones tales como las pruebas, puede utilizar la siguiente función:

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

que puede ser utilizado de la siguiente manera

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