跳至主要内容
版本: 9.x

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 还将 node_modules/.bin 包含在提供给 scriptsPATH 中。这意味着只要你安装了某个包,你就可以像使用普通命令一样在脚本中使用它。例如,如果你安装了 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

聚合来自并行运行的子进程的输出,并且仅在子进程完成时打印输出。它使在使用 --parallel--workspace-concurrency=<number> 运行 pnpm -r <command> 后读取大型日志变得容易得多(尤其是在 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 <package_selector>

阅读有关过滤的更多信息。

.npmrc 设置

enable-pre-post-scripts

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

true 时,pnpm 会自动运行任何预/后脚本。因此,运行 pnpm foo 就相当于运行 pnpm prefoo && pnpm foo && pnpm postfoo

script-shell

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

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

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

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

shell-emulator

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

true 时,pnpm 将使用 类似 bash 的 shell 的 JavaScript 实现来执行脚本。

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

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

但是,如果 shell-emulator 设置为 true,它将在所有平台上都能正常工作。