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/ && ./configure
funcionaría en sistemas tipo UNIX pero no en Windows.
Por qué: La raíz del problema es que el configure
comando del repositorio de Python genera archivos en el directorio donde se llama. Sin embargo, los archivos son relevantes para la construcción make
y los make install
buscan en el directorio del repositorio.
En este caso, no puedo cambiar el Makefile
ya que el proceso de compilación de Python es comprensiblemente complejo.
Alternativa: La alternativa es probablemente escribir algunos install.js
y 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/ && ./configure
debería funcionar en Windows, ¿qué problema encuentra?./configure --prefix=$(pwd)/somepath
. No es lindo. No lo he encontrado todavía, peronpm
probablemente 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.json
arriba. Sinchild_process
embargo, 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:
npm
permite solo hacercd dir && command -args
, que también se ejecutará en Windows.Se
node
ha 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