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 先前存在的 PATH
, pnpm run
也包括在 PATH
中的 node_modules/.bin
提供的scripts
。 这意味着只要您安装了一个 package
,您就可以像普通的命令一样在脚本中使用。 例如,如果您安装了 eslint
,您可以像这样写一个脚本:
"lint": "eslint src --fix"
甚至如果 eslint
没有在你的 shell 中全局安装,它也会运行。
对于工作空间,截至 v3.5 , <workspace root>/node_modules/.bin
也将添加到PATH
中,因此如果在工作空间根目录中安装了一个工具,则可以在工作空间的任何package
的 scripts
中使用。
与 npm run
的差异
默认情况下, pnpm 不会任意运行用户定义的 pre
和 post
钩子脚本(例如 prestart
)。 这种从 npm 继承的行为导致脚本是隐式的而不是显式的,从而混淆了执行流程。 它还会导致意外执行 pnpm serve
和 pnpm 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
。