跳到主内容
版本:Next

pnpm run

别名: run-script

运行一个在 package的 manifest 文件中定义的脚本。

示例

假如您有个 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

script-shell

  • Default: 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,它将适用于所有平台。

--recursive, -r

这会从每一个 package的“ scripts”对象中执行任意一个命令。 如果一个 package没有此命令,就会被跳过。 如果所有 package都没有这个命令,则会执行失败。

--if-present

如果脚本未定义,那么您可以使用 --if-present 标志以避免遇到用非零的退出代码从而导致退出。 这使您可以在不中断执行链的情况下运行还没有定义的脚本。

--parallel

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

--stream

立即从子进程流式传输输出,并以原始包目录为前缀。 这将允许不同软件包的输出交互。

--aggregate-output

聚合并行运行的子进程的输出,并且仅在子进程完成时打印输出。 它使在运行 pnpm -r <command> 时使用 --parallel--workspace-concurrency=<number> 后读取大日志更容易(尤其是在 CI 上)。 仅支持 --reporter=append-only

enable-pre-post-scripts

  • 默认值: false
  • 类型:Boolean

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

--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 的可能值为:“已通过”、“已排队”、“正在运行”。

--reporter-hide-prefix

Hide workspace prefix from output from child processes that are run in parallel, and only print the raw output. This can be useful if you are running on CI and the output must be in a specific format without any prefixes (e.g. GitHub Actions annotations). Only --reporter=append-only is supported.

--filter <package_selector>

阅读更多有关 filter 的内容。