web-dev-qa-db-fra.com

Changer le répertoire de travail pour les scripts npm

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.

68

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.

67

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é par package.json comme ci-dessus. L'API de child_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.

5
Paul Sweatte