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.
fuente

cd deps/2.7/cpython/ && ./configuredebería funcionar en Windows, ¿qué problema encuentra?./configure --prefix=$(pwd)/somepath. No es lindo. No lo he encontrado todavía, peronpmprobablemente lo esté usandovar 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.install.js, que hace aproximadamente eso y se llama desdepackage.jsonarriba. Sinchild_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 felizRespuestas:
npmpermite solo hacercd 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.fuente
Como se señaló anteriormente:
var spawn = require('child_process').spawn{cwd: pwd + 'somepath'}fuente