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?
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:
Pour une solution Bash uniquement, reportez-vous à la section "Solution 1".
Si un support multiplateforme est requis, suivez la solution décrite dans la section "Solution 2".
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:
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).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:
Dans ce cas, la partie finale dv
est l'argument qui sera transmis à votre script vumper
.
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 pargetopt
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èsnpm run
et non à un script antérieur ou postérieur.
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
.
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"