pnpm run
别名: run-script
运行包清单文件中定义的脚本。
示例
假设你在你的 package.json
中配置了一个 watch
脚本,如下所示
"scripts": {
"watch": "webpack --watch"
}
现在你可以使用 pnpm run watch
运行该脚本!很简单,对吧?对于那些喜欢节省按键次数和时间的用户来说,需要注意的是,所有脚本都将作为 pnpm 命令的别名,因此最终 pnpm watch
只是 pnpm run watch
的简写(仅适用于名称与现有 pnpm 命令不相同的脚本)。
运行多个脚本
你可以使用正则表达式而不是脚本名称来同时运行多个脚本。
pnpm run "/<regex>/"
运行所有以 watch:
开头的脚本
pnpm run "/^watch:.*/"
详情
除了 shell 现有的 PATH
之外,pnpm run
还将 node_modules/.bin
包含在提供给 scripts
的 PATH
中。这意味着只要你安装了某个包,你就可以像使用普通命令一样在脚本中使用它。例如,如果你安装了 eslint
,你可以编写一个这样的脚本
"lint": "eslint src --fix"
即使 eslint
没有在你的 shell 中全局安装,它也会运行。
对于工作区,<workspace root>/node_modules/.bin
也被添加到 PATH
中,因此如果某个工具安装在工作区根目录中,它可以在任何工作区包的 scripts
中被调用。
环境
pnpm 会为执行的脚本自动创建一些环境变量。这些环境变量可用于获取有关正在运行进程的上下文信息。
这些是 pnpm 创建的环境变量
- npm_command - 包含执行的命令的名称。如果执行的命令是
pnpm run
,则此变量的值将为 "run-script"。
选项
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
--recursive, -r
这会从每个包的 "scripts" 对象中运行任意命令。如果某个包没有该命令,则跳过它。如果所有包都没有该命令,则命令失败。
--if-present
你可以使用 --if-present
标志来避免在脚本未定义时退出非零退出代码。这使你能够运行可能未定义的脚本,而不会中断执行链。
--parallel
完全忽略并发性和拓扑排序,在所有匹配的包中立即运行给定的脚本,并带有前缀流输出。对于在多个包上运行的长时间运行的进程,例如漫长的构建过程,这是首选标志。
--stream
立即从子进程流输出,并带有源包目录的前缀。这允许来自不同包的输出交织在一起。
--aggregate-output
聚合来自并行运行的子进程的输出,并且仅在子进程完成时打印输出。它使在使用 --parallel
或 --workspace-concurrency=<number>
运行 pnpm -r <command>
后读取大型日志变得容易得多(尤其是在 CI 上)。仅支持 --reporter=append-only
。
--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
的可能值为: 'passed', 'queued', 'running'。
--reporter-hide-prefix
隐藏来自并行运行的子进程的输出中的工作区前缀,并且仅打印原始输出。如果你在 CI 上运行,并且输出必须以特定格式(没有任何前缀)显示(例如 GitHub Actions 注释),这将非常有用。仅支持 --reporter=append-only
。
--filter <package_selector>
.npmrc 设置
enable-pre-post-scripts
- 默认值: true
- 类型: 布尔值
当 true
时,pnpm 会自动运行任何预/后脚本。因此,运行 pnpm foo
就相当于运行 pnpm prefoo && pnpm foo && pnpm postfoo
。
script-shell
- 默认值: null
- 类型: 路径
用于使用 pnpm run
命令运行脚本的 shell。
例如,要强制在 Windows 上使用 Git Bash
pnpm config set script-shell "C:\\Program Files\\git\\bin\\bash.exe"
shell-emulator
- 默认值: false
- 类型: 布尔值
当 true
时,pnpm 将使用 类似 bash 的 shell 的 JavaScript 实现来执行脚本。
此选项简化了跨平台脚本编写。例如,默认情况下,下一个脚本将在非 POSIX 兼容系统上失败
"scripts": {
"test": "NODE_ENV=test node test.js"
}
但是,如果 shell-emulator
设置为 true
,它将在所有平台上都能正常工作。