跳到主内容
版本:8.x

pnpm run

别名: run-script

运行在软件包清单文件中定义的脚本。

示例

假如你有个 watch 脚本配置在了 package.json 中,像这样:

"scripts": {
"watch": "webpack --watch"
}

你现在可以使用 pnpm run watch 运行该脚本! 很简单吧? 对于那些不喜欢敲键盘而浪费时间的人要注意的另一件事是,所有脚本都会有 pnpm 命令的别名,所以最终 pnpm run watch 的简写是 pnpm watch仅适用于那些不与已有的 pnpm 命令相同名字的脚本)。

运行多个脚本

你可以使用正则表达式来替代脚本名称从而同时运行多个脚本。

pnpm run "/<regex>/"

运行所有以watch:开头的脚本。

pnpm run "/^watch:.*/"

详细说明

除了在shell中已经存在的 PATH, pnpm run脚本中还包含 node_modules/.binPATH 。 这意味着,只要你安装了一个包,你就可以像常规命令一样在脚本中使用它。 例如,如果你已经安装了 eslint 你可以像这样写一个脚本:

"lint": "eslint src --fix"

尽管 eslint 没有在你的shell中进行全局安装,它也会运行。

对于workspaces, <workspace root>/node_modules/.bin 也会被添加到 到 PATH中,因此如果在工作空间根目录中安装了工具,则可以在任何workspace package的 scripts中调用它 。

npm run的不同之处

默认情况下, pnpm 不会任意执行用户定义的 hook,pre post (例如 prestart)。 这种从npm继承过来的习惯,会导致脚本执行是隐式的,而不是显式的,从而混淆了执行流程。 它还会导致意外执行 pnpm servepnpm preserve

如果出于某种原因您需要使用 npm 的前置/后置脚本,请使用 enable-pre-post-scripts 选项。

运行环境

pnpm 会自动为执行的脚本创建一些环境变量。 这些环境变量可用于获取有关正在运行的进程的上下文信息。

以下是 pnpm 会创建的环境变量:

  • npm_command - 包含已执行命令的名称。 如果执行的命令是 pnpm run,那么这个变量的值就是“run-script”。

配置项

run 命令的options都应列在脚本名称之前。 脚本名称后列出的options将传递给执行的脚本。

例如下面这些都将使用 --silent 选项运行 pnpm CLI:

pnpm run --silent watch
pnpm --silent run watch
pnpm --silent watch

脚本名称后的任何参数都将添加到执行的脚本中。 所以如果 watch 运行 webpack --watch,那么这个命令:

pnpm run watch --no-color

将运行:

webpack --watch --no-color

--recursive, -r

这个命令将运行每个软件包中的“script”中的脚本。 如果一个包没有相应的命令,将被跳过。 如果所有包都没有该命令,则该命令将失败。

--if-present

可以使用 --if-present ,来避免在脚本未定义时,以非零退出码退出。 这使您可以运行可能未定义的脚本,从而避免中断执行链。

--parallel

完全忽略并发和拓扑排序,在所有匹配的包中立即运行给定的脚本 并输出前缀流。 这是个推荐的标志,用于在许多 packages上长时间运行的进程,例如冗长的构建进程。

--stream

即时串流子进程的输出,并添加软件包的目录作为前缀。 这可能导致来自不同包的输出内容出现交错。

--aggregate-output

聚合并行运行的子进程的输出,并且仅在子进程完成时打印输出。 它在 pnpm -r <command> 时使用 --parallel 或者 --workspace-concurrency=<number> 产生的大段日志更易读(尤其是在 CI 环境下)。 只支持 --reportter=append-only

--resume-from <package_name>

从特定项目中执行。 如果您有一个巨大的工作区并且希望在特定项目中重新启动构建,而不运行构建顺序中位于它之前的所有项目,这将很有用。

--report-summary

将脚本执行的结果记录到 pnpm-exec-summary.json 文件中。

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
}
}

status 的可能值为:“passed”、“queued”、“running”。

--reporter-hide-prefix

添加于:v8.8.0

从并行运行的子进程的输出中隐藏工作空间前缀,并且仅打印原始输出。 如果你在 CI 上运行并且输出必须是不带任何前缀的特定格式(例如 GitHub Actions annotations),这会很有用。 仅支持 --reporter=append-only

--filter <package_selector>

阅读更多有关过滤的内容。

.npmrc 设置

enable-pre-post-scripts

  • 默认值: false
  • 类型:Boolean

当置为 true,pnpm 将自动运行任何前置/后置钩子脚本。 所以运行 pnpm foo,就相当于运行 pnpm prefoo && pnpm foo && pnpm postfoo

script-shell

  • 默认值:null
  • 类型:path

设置执行 pnpm run 命令脚本的 shell。

例如,在 Windows 系统上强制使用 Git Bash:

pnpm config set script-shell "C:\\Program Files\\git\\bin\\bash.exe"

shell-emulator

  • 默认值: false
  • 类型:Boolean

当置为 true,pnpm 将使用 bash-like shell 这个JavaScript 实现的执行器来运行脚本。

该选项简化了跨平台脚本。 例如,默认情况下,下述脚本将在非 POSIX 标准兼容系统下运行失败:

"scripts": {
"test": "NODE_ENV=test node test.js"
}

但是,如果 shell-emulator 设置为 true,它将适用于所有平台。