Passer au contenu principal
Version : Suivant

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.