web-dev-qa-db-fra.com

Passer des arguments de ligne de commande aux scripts npm dans package.json

J'ai les scripts ci-dessous dans mon package.json:

"scripts": {
    "vumper": "node node_modules/vumper/index.js",
    "format": "prettier --single-quote -width=80 --write package.json"
 },

Le paquetage "vumper" prend un argument en ligne de commande (tel que "dv"). Ce que j'aimerais pouvoir faire, c'est avoir une commande qui les exécute les deux successivement.

Essentiellement, j'aimerais pouvoir exécuter:

npm run vumber dv

et alors

npm run format

mais dans une commande, quelque chose comme 

npm run my-build dv

qui exécuterait les deux commandes ci-dessus, en acceptant correctement l’argument de ligne de commande 'dv' et en le passant à la première exécution de npm. Est-ce possible?

4
Tony Scialo

Réponse courte:

Ce que vous voulez en réalité, c’est que vous ayez un script npm ressemblant à ceci, dans lequel <arg-here> est fourni via la CLI;

...
"scripts": {
  "my-build": "npm run vumper <arg-here> && npm run format",
  ...
},
...

Malheureusement, npm n’a pas de fonction intégrée pour y parvenir. 

L'option spéciale npm --, (reportez-vous à la fin de Solution 1 ci-dessous pour plus d'informations sur cette option), ne peut être utilisée que pour passer un argument à la END d'un script mais pas dans le milieu. Donc, si vos deux commandes étaient dans l'ordre inverse, l'option -- pourrait être utilisée comme ceci:

...
"scripts": {
  "my-build": "npm run format && npm run vumper --",
  ...
},
...

Pour surmonter la limitation liée à l'absence de fonctionnalité intégrée permettant de passer un argument dans le MIDDLE d'un script, envisagez les solutions suivantes:

  1. Pour une solution Bash uniquement, reportez-vous à la section "Solution 1".

  2. Si un support multiplateforme est requis, suivez la solution décrite dans la section "Solution 2".


Solution 1 - Bash (MacOS/Linux/etc ..)} _:

Configurez votre script my-build dans la section scripts de package.json pour appeler une fonction Bash Shell , comme indiqué ci-dessous:

package.json

...
"scripts": {
  "my-build": "func() { npm run vumper \"$1\" && npm run format; }; func",
  "vumper": "node node_modules/vumper/index.js",
  "format": "prettier --single-quote -width=80 --write package.json"
},
...

Explication:

La fonction Bash nommée func effectue les opérations suivantes:

  1. Tout d'abord, exécute npm run vumper <arg>. Dans ce cas, <arg> sera l'argument du shell transmis via l'interface de ligne de commande. Il est référencé dans le script à l'aide de $1 (c'est-à-dire le premier paramètre de position /argument).
  2. Il exécute ensuite le script nommé format via la commande npm run format.

Ces deux commandes npm run étant chaînées à l'aide de l'opérateur &&, la deuxième commande npm run format ne s'exécutera que si la commande initiale npm run vumper <arg> se termine correctement (c'est-à-dire qu'elle renvoie un code de sortie 0).

Exécution du script my-build:

Pour appeler my-build via votre CLI, vous devez exécuter:

npm run my-build -- dv

Remarque:

  1. Dans ce cas, la partie finale dv est l'argument qui sera transmis à votre script vumper.

  2. L'option spéciale -- doit être spécifiée avant l'argument. Docs décrit l’option -- comme suit:

    ... L'option spéciale -- est utilisée par getopt pour délimiter la fin des options. npm transmettra tous les arguments après le -- directement à votre script: ... Les arguments ne seront transmis qu'au script spécifié après npm run et non à un script antérieur ou postérieur.


Solution 2 - multiplateforme:

Pour une solution multiplate-forme (qui fonctionne avec Bash, Invite de commande Windows/cmd.exe, PowerShell, etc.), vous devez utiliser un script d'assistance nodejs comme suit.

run.js

Appelons le script nodejs run.js et enregistrez-le dans le répertoire racine du projet, au même niveau que package.json.

const execSync = require('child_process').execSync;

const arg = process.argv[2] || 'dv'; // Default value `dv` if no args provided via CLI.

execSync('npm run vumper ' + arg, {stdio:[0, 1, 2]});
execSync('npm run format', {stdio:[0, 1, 2]});

package.json

Configurez votre script my-build pour appeler run.js comme suit:

...
"scripts": {
  "my-build": "node run",
  "vumper": "node node_modules/vumper/index.js",
  "format": "prettier --single-quote -width=80 --write package.json"
},
...

Exécution du script my-build:

Selon (Solution 1} _, pour appeler my-build via votre interface de ligne de commande, vous devez exécuter:

npm run my-build -- dv

Explication:

  • run.js _ utilise process.argv pour obtenir l'argument transmis via l'interface de ligne de commande (par exemple, dv). Si aucun argument n'est fourni lors de l'exécution de npm run my-build, la valeur par défaut (c'est-à-dire dv) est transmise au vumper npm-script.

  • run.js utilise également child_process.execSync(...) à Shell-out// invoque les deux commandes npm run.

9
RobC

Je pense que vous pouvez utiliser simultanément.

https://www.npmjs.com/package/concurrently

Vous devez d'abord installer simultanément puis utiliser comme suit,

Plusieurs commandes peuvent être exécutées avec des arguments est pris en charge

Donc dans votre cas, ce sera

concurrently "npm:vumber dv" "npm:format"
0
Sanish Joseph