跳到主要内容
版本:Next

pnpm run

别名:run-script

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

示例

假设你的 package.json 中配置了一个 watch 脚本,如下所示:

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

现在可以通过使用 pnpm run watch 来运行该脚本!很简单,对吧? 对于那些喜欢节省按键次数和时间的人来说,所有脚本都会被自动映射为 pnpm 命令,因此最终 pnpm watch 只是 pnpm run watch 的简写形式(仅适用于不与现有 pnpm 命令同名的脚本)。

运行多个脚本

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

pnpm run "/<regex>/"

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

pnpm run "/^watch:.*/"

细节

除了 shell 现有的 PATH 之外,pnpm run 还会在提供给脚本的 PATH 中包含 node_modules/.bin。这意味着只要你安装了某个包,就可以在脚本中像常规命令一样使用它。例如,如果你安装了 eslint,你可以编写如下脚本:

"lint": "eslint src --fix"

即使 eslint 没有在你的 shell 中全局安装,它也会运行。

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

环境变量

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

pnpm 创建的环境变量包括:

  • npm_command - 包含执行命令的名称。如果执行的命令是 pnpm run,则此变量的值将为 "run-script"。

选项

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

所有这些都将运行带有 --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

从每个包的 "scripts" 对象中运行任意命令。 如果某个包没有该命令,则会被跳过。 如果没有任何包具有该命令,则命令失败。

--if-present

你可以使用 --if-present 标志来避免在脚本未定义时以非零退出代码退出。这让你可以运行潜在未定义的脚本而不破坏执行链。

--parallel

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

--stream

立即从子进程中流式输出,以前缀形式显示源包目录。这允许不同包的输出交错显示。

--aggregate-output

聚合并行运行的子进程输出,仅在子进程完成时打印输出。它使阅读在运行 pnpm -r <command> 时带有 --parallel--workspace-concurrency=<number> 的大型日志更容易(尤其是在 CI 上)。仅支持 --reporter=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

隐藏并行运行子进程输出中的工作区前缀,仅打印原始输出。如果你在 CI 上运行且输出必须以特定格式无任何前缀时很有用(例如 GitHub Actions 注解)。仅支持 --reporter=append-only

--filter <包选择器>

了解更多关于过滤的内容

pnpm-workspace.yaml 设置

enablePrePostScripts

  • 默认值:true
  • 类型:布尔值

当为 true 时,pnpm 将自动运行任何 pre/post 脚本。因此运行 pnpm foo 将类似于运行 pnpm prefoo && pnpm foo && pnpm postfoo

scriptShell

  • 默认值:null
  • 类型:路径

使用 pnpm run 命令运行脚本时使用的 shell。

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

pnpm config set scriptShell "C:\\Program Files\\git\\bin\\bash.exe"

shellEmulator

  • 默认值:false
  • 类型:布尔值

当为 true 时,pnpm 将使用 bash-like shell 的 JavaScript 实现来执行脚本。

此选项简化了跨平台脚本编写。例如,默认情况下,下一个脚本将在非 POSIX 兼容系统上失败:

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

但如果 shellEmulator 设置为 true,它将在所有平台上工作。