pnpm run
别名: run-script
运行一个在 package
的 manifest 文件中定义的脚本。
示例
假如您有个 watch
脚本配置在了package.json
中,像这样:
"scripts": {
"watch": "webpack --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 中全局安装,它也会运行。
对于工作空间, <workspace root>/node_modules/.bin
也添加到 到 PATH
中,因此如果在工作空间根目录中安装了工具,则可以在任何工作空间包的 脚本
中调用它 。
与 npm run
的差异
默认情况下, pnpm 不会任意运行用户定义的 pre
和 post
钩子脚本(例如 prestart
)。 这种从 npm 继承的行为导致脚本是隐式的而不是显式的,从而混淆了执行流程。 它还会导致意外执行 pnpm serve
和 pnpm preserve
。
如果出于某种原因您需要 npm 的前置、后置钩子脚本,可使用enable-pre-post-scripts
选项。
配置项
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
script-shell
- 默认值:null
- 类型:path
设置执行 pnpm run
命令脚本的 shell。
例如,要强制在 Windows 上使用 Git Bash:
pnpm 配置中设置 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
以起始package
目录作为前缀,立即从子进程输出流。 这允许从不同的 package
交替输出。
--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
。