Cambiar el directorio de trabajo para los scripts npm

82

P: ¿Es posible cambiar el contexto en el que npm ejecuta scripts?

Lo que quiero es lo siguiente:

"scripts": {
   "test": "gulp mocha",
   "pre-install": "./deps/2.7/cpython/configure --prefix=$(pwd)/build --exec-prefix=$(pwd)/build && make -C deps/2.7/cpython && make -C deps/2.7/cpython install",
   "install": "node-gyp rebuild"
},

Obviamente cd deps/2.7/cpython/ && ./configurefuncionaría en sistemas tipo UNIX pero no en Windows.

Por qué: La raíz del problema es que el configurecomando del repositorio de Python genera archivos en el directorio donde se llama. Sin embargo, los archivos son relevantes para la construcción makey los make installbuscan en el directorio del repositorio.

En este caso, no puedo cambiar el Makefileya que el proceso de compilación de Python es comprensiblemente complejo.

Alternativa: La alternativa es probablemente escribir algunos install.jsy usar la API independiente del sistema operativo del nodo y algunos child_process.exec(), lo que probablemente haré. Sin embargo, no dejar npm sería realmente bueno.

eljefedelrodeodeljefe
fuente
1
Creo que no hay nada de malo en escribir un script adicional y ejecutarlo desde npm.
webduvet
2
cd deps/2.7/cpython/ && ./configuredebería funcionar en Windows, ¿qué problema encuentra?
Richard Williams
Varios. No puedes usar ./configure --prefix=$(pwd)/somepath. No es lindo. No lo he encontrado todavía, pero npmprobablemente lo esté usando var spawn = require('child_process').spawn, lo que le permitiría configurar opciones como {cwd: pwd + 'somepath'}, pero no lo expone. Su filosofía también: la gestión de paquetes tiene muchas funciones que tienen en común con las herramientas de compilación. Si van por este camino, también deben tener ciertas características como esta.
eljefedelrodeodeljefe
2
Lo resolví con un bastante grande install.js , que hace aproximadamente eso y se llama desde package.jsonarriba. Sin child_processembargo, la API de no es tan fácil de manejar, ya que atraviesa una gran cantidad de errores difíciles de depurar. Me tomó algo de tiempo, pero ahora estoy feliz
eljefedelrodeodeljefe
Escribió un PR aquí
eljefedelrodeodeljefe

Respuestas:

91

npmpermite solo hacer cd dir && command -args, que también se ejecutará en Windows.

Se nodeha realizado un cambio para usar la funcionalidad de generación en PR https://github.com/npm/npm/pull/10958 , pero fue rechazado debido a la solución anterior.

eljefedelrodeodeljefe
fuente
1
No estoy seguro de haber hecho algo, pero recientemente tuve esta interrupción en Windows.
6

Como se señaló anteriormente:

npm probablemente esté usando

var spawn = require('child_process').spawn

lo que le permitiría configurar opciones como:

    {cwd: pwd + 'somepath'}

pero no lo expone.

Lo resolví con un bastante grande install.js, que hace aproximadamente eso y se llama desde package.jsonarriba. Sin child_processembargo, la API de no es tan fácil de manejar, ya que arroja muchos errores difíciles de depurar. Me tomó algo de tiempo, pero ahora estoy feliz.

Paul Sweatte
fuente
Derechos. Desafortunadamente, ha sido rechazado en PR como se señaló en mi respuesta.
eljefedelrodeodeljefe
similar a: stackoverflow.com/questions/18894433/… que también funciona para mí
yeahdixon