Changer le répertoire de travail pour les scripts npm

Q: Est-il possible de changer le contexte dans lequel npm exécute les scripts?

Ce que je veux est le suivant:

"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" }, 

De toute évidence, cd deps/2.7/cpython/ && ./configure fonctionnerait sur les systèmes UNIX, mais pas sur Windows.

Pourquoi: La racine du problème est que la commande configure du référentiel python génère des fichiers dans le répertoire où il est appelé. Les fichiers sont toutefois utiles pour make et make install qui recherchent les fichiers dans le répertoire du repository.

Dans ce cas, je ne peux pas changer le Makefile car le processus de construction de Python est compréhensible.

Alternative: L’alternative consiste probablement à écrire quelques install.js et à utiliser l’API indépendante du système d’exploitation du noeud et certains 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 s’exécutera également sous Windows.

Une modification pour utiliser la fonctionnalité de réapparition du node a été effectuée dans 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 comme:

  {cwd: pwd + 'somepath'} 

mais ne l’expose pas.

Je l’ai résolu avec un install.js assez volumineux, qui fait grosso modo cela et qui est appelé depuis package.json comme ci-dessus. L’API de child_process n’est cependant pas facile à gérer car elle génère des erreurs de débogage difficiles. Il m’a fallu du temps, mais je suis heureux maintenant.