跳到主内容
版本:6.x

pnpm run

别名: run-script

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

示例

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

"scripts": {
"watch": "build-command --watch"
}

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

详细

除了 shell 先前存在的 PATHpnpm run 也包括在 PATH 中的 node_modules/.bin提供的scripts。 这意味着只要您安装了一个 package,您就可以像普通的命令一样在脚本中使用。 例如,如果您安装了 eslint ,您可以像这样写一个脚本:

"lint": "eslint src --fix"

甚至如果 eslint 没有在你的 shell 中全局安装,它也会运行。

对于工作空间,截至 v3.5 , <workspace root>/node_modules/.bin 也将添加到PATH中,因此如果在工作空间根目录中安装了一个工具,则可以在工作空间的任何packagescripts中使用。

npm run 的差异

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

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

配置项

script-shell

添加于:v5.10.0

  • 默认值: null
  • 类型:path

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

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

pnpm 配置中设置 script-shell "C:\\Program Files\\git\\bin\\bash.exe"

shell-emulator

添加于:v5.8.0

  • 默认值: false
  • Type: 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

添加于:v4.5.0

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

--parallel

添加于:v5.1.0

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

--stream

添加于:v5.1.0

以起始package目录作为前缀,立即从子进程输出流。 这允许从不同的 package交替输出。

--aggregate-output

添加于:v6.24.0

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

enable-pre-post-scripts

添加于:v6.1.0

  • 这允许从不同的 package交替输出。
  • 类型:Boolean

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

--filter <package_selector>

阅读更多有关 filter 的内容。