2011-12-21 13 views
12

Estoy construyendo una aplicación que consiste en private npm repos integrado en CoffeeScript. Para mantener el lenguaje de implementación independiente y permitir que cada aplicación especifique su versión de CoffeeScript, incluyo CoffeeScript como una dependencia en cada biblioteca y compilando JavaScript en la instalación de npm.Compilación coffeescript en npm install

npm la instalación funciona bien para los repositorios independientes, pero falla cuando intento instalar un repositorio que depende de otro repositorio que se está creando.

Así que si tengo repo-a, cuya package.json incluye lo siguiente:

"dependencies": { 
    "coffee-script": "~1.2.0" 
}, 
"scripts": { 
    "install": "./node_modules/coffee-script/bin/cake install" 
} 

y repo-b, cuya package.json incluye lo siguiente:

"dependencies": { 
    "coffee-script": "~1.2.0", 
    "repo-a": "git+ssh://[email protected]:myrepo.git" 
}, 
"scripts": { 
    "install": "./node_modules/coffee-script/bin/cake install" 
} 

donde ambos tienen una Cakefile que tiene este aspecto, con un install tarea llamada en un npm install gancho:

{print} = require "util" 
{spawn} = require "child_process" 

coffee = "./node_modules/coffee-script/bin/coffee" 

echo = (child) -> 
    child.stdout.on "data", (data) -> print data.toString() 
    child.stderr.on "data", (data) -> print data.toString() 
    child 

install = (cb) -> 
    console.log "Building..." 
    echo child = spawn coffee, ["-c", "-o", "lib", "src"] 
    child.on "exit", (status) -> cb?() if status is 0 

task "install", "Install, build, and test repo", install 

npm install obras para para repo-a, pero falla por repo-b con este mensaje:

sh: ./node_modules/coffee-script/bin/cake: No such file or directory 

momento en el que existe un directorio sin terminar ___coffee-script.npm en node_modules.

Por supuesto, sería mucho más fácil usar un app.js wrapper, pero necesito implementar JavaScript, no CoffeeScript. ¿Alguien puede decirme cómo podría hacer que esto funcione?

+0

por lo que vale la pena, este enfoque funciona cuando me baso en un binario global 'cake', y solo falla porque estoy especificando el' cake' instalado localmente. –

Respuesta

9

Dos cosas.

  1. Si está ejecutando la torta de un comando de la NGP, sólo puede especificar cake install o cake build como el campo scripts.install. Esto se ejecutará después de coffee-script se ha instalado localmente, y su bin vinculado adecuadamente (con una cuña en Windows), y se ejecutará con un entorno PATH tal que se utiliza cake instalado localmente en lugar de cualquier otra cosa en la ruta del sistema .
  2. Si eres no se ejecuta este comando de un mecanismo nacional de prevención, pero que está esperando, no obstante, que coffeescript ya se ha instalado localmente a través de la NGP (que parece), entonces es probable que debe golpear ./node_modules/.bin/cake o bien ./node_modules/.bin/coffee que sumergirse en el paquete interno.

Si no va a instalar coffeescript con NPM, pero en lugar de utilizar algunos submódulos git o algo así, entonces usted está en su propia :)

+1

muchas gracias, isaac. No me di cuenta de que el alcance de npm se extendía a 'bin', eso es una noticia increíble. cuanto más aprendo sobre "npm the tool" (en comparación con "npm the repo of repos"), más me encanta. es una gran pieza de software. –

+1

Agregar 'node_modules/.bin /' a 'PATH' (1.) es realmente bueno ya que solo podemos usar los binarios de node_module como regulares. ¡Gracias por compartir este increíble truco! – abernier

4

Recomendaría construir localmente el JS y almacenar los paquetes compilados como archivos tar.gz en S3. Para el desarrollo local puede npm link y en producción señala las URL de archivo. Si no desea versionar sus dependencias, puede tener la misma url actualizada una y otra vez.

Tenga en cuenta este error de npm así: https://github.com/isaacs/npm/issues/1727 (básicamente tendrá que borrar su carpeta node_modules cada vez que actualice los deps en una aplicación que usa git/http urls como números de versión).

--fg

+0

Impresionante, gracias por los consejos, Félix. Creo que terminaré yendo con la solución de [@ jashkenas] (http://twitter.com/jashkenas/status/149516518802198528) por ahora, y compilando sin comandos del módulo provisto. –

Cuestiones relacionadas