pnpm run
Alias : run-script
Exécute un script défini dans le fichier manifeste du projet.
Exemples
Imaginons que vous avez un script watch
configuré dans votre package.json
, comme ceci :
"scripts": {
"watch": "webpack --watch"
}
Vous pouvez maintenant exécuter ce script en utilisant pnpm run watch
! Simple, non ? Une autre chose à noter pour ceux qui aiment économiser du temps est que tous les scripts sont aussi des alias de la commande pnpm, donc finalement pnpm watch
est juste un raccourci pour pnpm run watch
(UNIQUEMENT pour les scripts qui ne partagent pas le même nom que les commandes pnpm déjà existantes).
Exécuter plusieurs scripts
Vous pouvez exécuter plusieurs scripts en même temps en utilisant une expression régulière au lieu du nom du script.
pnpm run "/<regex>/"
Exécutez tous les scripts commençant par watch:
:
pnpm run "/^watch:.*/"
Détails
En plus du PATH
préexistant du shell, pnpm run
inclus node_modules/.bin
dans le PATH
fourni aux scripts
. Cela a pour conséquence que du moment où vous avez un package installé, vous pouvez l'utiliser dans un script comme une commande classique. Par exemple, si vous avez installé eslint
, vous pouvez écrire un script comme celui-ci :
"lint": "eslint src --fix"
Et même si eslint
n'est pas installé globalement sur votre machine, la commande sera run.
Pour les workspaces, <workspace root>/node_modules/.bin
est aussi ajouté au PATH
, donc si un outil est installé à la racine d'un workspace il pourra être utilisé dans tous les scripts
du workspace.
Environnent
Pnpm crée automatiquement certaines variables d'environnement pour les scripts, lorsque ceux-ci sont exécutés. Ces variables d'environnement peuvent être utilisées pour obtenir des informations contextuelles sur le processus en cours.
Voici les variables d'environnement créées par pnpm :
- npm_command - contient le nom de la commande exécutée. Si la commande exécutée est
pnpm run
, alors la valeur de la variable sera "run-script".
Options
Toutes les options pour la commande run
devraient être listées avant le nom du script. Les options listées après le nom du script seront transmises au script exécuté.
Toutes ces commandes exécuteront pnpm CLI avec l'option --silent
:
pnpm run --silent watch
pnpm --silent run watch
pnpm --silent watch
Tous les arguments situés après le nom de la commande sont ajoutés au script exécuté. Donc si watch
exécute webpack --watch
, alors cette commande :
pnpm run watch --no-color
exécutera :
webpack --watch --no-color
--recursive, -r
Cette option permet exécuter une commande dans l'ensemble des package.json si la commande existe dans l'objet "scripts". Si un package.json n'a pas la commande alors il est ignoré. Si aucun des package.json existant n'a la commande demandée, la commande échoue.
--if-present
Vous pouvez utiliser le flag --if-present
pour éviter une sortie du processus d'exécution avec un "non-zero exit code" lorsque le script est indéfini. Cela permet d'exécuter des scripts potentiellement indéfinis sans pour autant casser des chaînes d'exécution.
--parallel
Ignore complètement la concurrence et le tri topologique, exécutant un script donné immédiatement dans tous les packages correspondants avec un stream préfixé en sortie. C'est le flag à privilégier pour les processus de longue durée réalisés sur de nombreux packages, par exemple, un long processus de build.
--stream
Diffuse la sortie des processus enfants de façon immédiate. Sortie qui est préfixée par le répertoire du package d'origine. Cela permet d'entrelacer la sortie de différents paquets.
--aggregate-output
Regroupe la sortie des processus enfants exécutés en parallèle, et n'affiche la sortie qu'une fois le processus enfant terminé. Cela facilite grandement la lecture de grande quantité de logs après exécution de pnpm -r <command>
avec --parallel
ou avec --workspace- concurrency=<number>
(surtout sur CI). Seul --reporter=append-only
est pris en charge.
--resume-from <nom_du_paquet>
Reprend l’exécution à partir d’un projet spécifique. Cela peut être utile lorsque l'on travaille avec un workspace de taille conséquente et que l'on souhaite redémarrer une build depuis un projet spécifique sans devoir exécuter tous les projets qui le précèdent dans l’ordre de la build.
--report-summary
Enregistre le résultat des exécutions des scripts dans un fichier pnpm-exec-summary.json
.
Un exemple de fichier pnpm-exec-summary.json
:
{
"executionStatus": {
"/Users/zoltan/src/pnpm/pnpm/cli/command": {
"status": "passed",
"duration": 1861.143042
},
"/Users/zoltan/src/pnpm/pnpm/cli/common-cli-options-help": {
"status": "passed",
"duration": 1865.914958
}
}
Les valeurs possibles de status
sont : "passed" (succès), "queued" (en file d'attente), "running" (en cours d'exécution).
--reporter-hide-prefix
Masque le préfixe du workspace dans la sortie des processus enfants exécutés en parallèle, pour afficher uniquement la sortie brute. Cela peut être utile si vous utilisez CI et que la sortie doit être dans un format spécifique sans aucun préfixe (par exemple les annotations GitHub Actions). Seul --reporter=append-only
est pris en charge.
--filter <selecteur_de_paquet>
En savoir plus sur le filtrage.
Configurer .npmrc
enable-pre-post-scripts
- Par défaut: true
- Type: Boolean
Quant est à true
, pnpm exécutera tous les pre/post scripts automatiquement. Donc exécuter pnpm foo
exécutera pnpm prefoo && pnpm foo && pnpm postfoo
.
script-shell
- Par défaut: null
- Type: chemin
Défini le shell qui sera utilisé pour exécuter les scripts lancés avec la commande pnpm run
.
Par exemple, pour forcer l'utilisation de Git Bash sur Windows :
pnpm config set script-shell "C:\\Program Files\\git\\bin\\bash.exe"
shell-emulator
- Par défaut: false
- Type : Booléen
Quant à true
, pnpm utilisera une implémentation JavaScript d'un bash-like shell pour exécuter les scripts.
Cette option simplifie l'écriture de scripts sur différentes plateformes. Par exemple, si on utilise la valeur par défaut, le script qui suit échouera sur un système non-POSIX-compliant :
"scripts": {
"test": "NODE_ENV=test node test.js"
}
Mais si on configure shell-emulator
à true
, alors ce script fonctionnera sur toutes les plateformes.