2012-02-17 17 views
9

Aquí está la situación ... Así que he creado un módulo Node.js que actúa como interfaz para algunos motores de plantilla Node.js, Shift.js. Eso está incluido dentro de otro módulo Node.js, Design.io (se especifica el paquete package.json dependencies de Design.io). Design.io mira los archivos para ver los cambios."Error: no se puede encontrar el módulo 'menos'" Node.js módulo cargar preferencia/orden/caché?

Luego compila una aplicación y require('design.io'). También instala, digamos, Less y Stylus en su proyecto.

De esta manera, cuando se guarda un archivo o .less.styl, una cadena de métodos son llamados:

  1. require("design.io") recibe una notificación del evento de sistema de archivos. Design.io luego llama al
  2. require('shift').render(string, extension, callback). Shift.js luego llama al
  3. require(moduleFor(extension)) # require("less"). La cadena está compilada.

En mi aplicación (directorio de trabajo actual) que han instalado menos y lápiz:

npm install less stylus 

El problema que estoy teniendo es, en el paso 3 que se llama desde dentro de las Shift.js módulo, obtengo errores como este:

Error: Cannot find module 'less' 
    at Function._resolveFilename (module.js:334:11) 
    at Function._load (module.js:279:25) 
    at Module.require (module.js:357:17) 
    at require (module.js:368:17) 
    at Less.engine (/Users/viatropos/Documents/git/plugins/design.io/node_modules/shift/lib/shift/less.js:6:14) 
    at Less.render (/Users/viatropos/Documents/git/plugins/design.io/node_modules/shift/lib/shift/less.js:18:21) 
    at /Users/viatropos/Documents/git/plugins/design.io/node_modules/shift/lib/shift.js:69:23 
    at /Users/viatropos/Documents/git/plugins/design.io/node_modules/async/lib/async.js:118:13 
    at Object.forEachSeries (/Users/viatropos/Documents/git/plugins/design.io/node_modules/async/lib/async.js:134:9) 
    at Object.render (/Users/viatropos/Documents/git/plugins/design.io/node_modules/shift/lib/shift.js:78:31) 

Mi pregunta es, ¿por qué sucede esto? Pensé que podría necesitar dinámicamente bibliotecas de un módulo, siempre que se instalaran en algún lugar ... ¿Qué me falta?

El objetivo sería que las bibliotecas como Shift.js no tuvieran que definir cada dependencia en package.json ... Para una biblioteca de "interfaz para los motores de plantillas", eso requeriría demasiadas dependencias que la aplicación probablemente nunca sería utilizando.

Gracias por la ayuda, espero que sea algo claro.

+0

Creo que esto podría ser una solución ... Tengo un comando 'design.io' que llamo, que se desarrolló' require ('../ lib/design.io/process.js') 'que inicia todo el proceso del observador.Si cambio eso a 'require ('design.io/lib/design.io/process.js')', todo parece cargarse correctamente. Raro, b/c 'require.main.paths' son los mismos en ambos casos. –

Respuesta

25

Cuando npm install foo, el módulo foo se instala en un directorio llamado node_modules en el directorio de trabajo actual.

Al instalar esta biblioteca shift, que sólo busca módulos para requieren dentro de su propio directorio node_modules, o en uno de los directorios globales require.resolve() búsquedas.

Y esa es la solución sencilla a su problema:

npm install -g less 

Y a continuación, la biblioteca es visible globalmente a todo el código Node.js en su ordenador, en lugar de sólo estar visible para el código en el directorio de trabajo actual.

Alternativamente, si solo deseas shift a ver que, a continuación, hacer algo como esto:

npm install shift 
cd node_modules/shift 
npm install less 
Cuestiones relacionadas