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/.bin
的 PATH
。 这意味着,只要你安装了一个包,你就可以像常规命令一样在脚本中使用它。 例如,如果你已经安装了 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 serve
和 pnpm 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
- 默认值: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
的可能值为:“已通过”、“已排队”、“正在运行”。