Q: Est-il possible de changer le contexte dans lequel npm exécute des scripts?
Ce que je veux, c'est ce qui suit:
"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"
},
Il est évident que cd deps/2.7/cpython/ && ./configure
Fonctionnerait sur des systèmes de type UNIX mais pas sur Windows.
Why: La racine du problème réside dans le fait que la commande configure
du python repo envoie les fichiers dans le répertoire où ils sont appelés. Les fichiers cependant, la construction est pertinente pour make
et make install
qui recherchent les fichiers dans le répertoire du référentiel.
Dans ce cas, je ne peux pas changer le Makefile
car le processus de construction de Python est naturellement complexe.
Alternative: L'alternative est probablement d'écrire du install.js
Et d'utiliser l'API indépendante du système d'exploitation du noeud, ainsi que du child_process.exec()
, ce que je vais probablement faire. Cependant, ne pas laisser npm serait vraiment sympa.
npm
ne permet que de faire cd dir && command -args
, qui fonctionnera également sous Windows.
Une modification visant à utiliser la fonctionnalité spawn de node
a été apportée à PR https://github.com/npm/npm/pull/10958 , mais a été rejetée en raison de la solution ci-dessus.
Comme indiqué ci-dessus:
nPM utilise probablement
var spawn = require('child_process').spawn
ce qui vous permettrait de définir des options telles que:
{cwd: pwd + 'somepath'}
mais ne l'expose pas.
Je l'ai résolu avec un assez grand
install.js
, qui fait à peu près cela et il est appelé parpackage.json
comme ci-dessus. L'API dechild_process
_ n'est pas si facile à gérer, car il génère beaucoup d'erreurs difficiles à déboguer. Cela m'a pris du temps, mais je suis heureux maintenant.