脚本
环境文件
Yarn 会自动解释 .env.yarn
文件的内容,并将它们注入到 yarn run
运行的所有命令中。此行为可以通过使用 injectEnvironmentFiles
设置进行配置。
请注意,您还可以配置将加载的文件,但仅在存在时加载;这样就可以编写条件导入,例如
injectEnvironmentFiles:
- .env.yarn
- .env.local?
其中 .env.local
仅在存在时才优先,否则将被忽略。
并行任务
Yarn 具有对 scripts
字段中后台作业语法 (foo&
) 的原生集成。它将并行运行它们,并且输出的每一行都将以一个标识符为前缀,显示它们来自何处。例如,以下命令将并行运行 linting 和测试,并在两者都完成后报告
$ yarn lint & yarn test
可移植 shell
使用其他包管理器时,Windows 可移植性可能会很麻烦。脚本无法指望有 Posix shell 可用,因此你必须依赖奇怪的 hack 来使用半可移植脚本 - 或者干脆放弃它们,而使用 Node.js 脚本,这从一开始就违背了小巧、非侵入式脚本的目的。也就是说,除非你使用 Yarn!
Yarn 实现并维护了一个类 Posix shell 解释器,它支持你在脚本中通常会找到的所有语法,以及一些简单的内置函数,如 cd
/ echo
。例如,尽管分配了环境变量,但以下命令在 Windows 和 Linux 上都能正常工作
$ NODE_ENV=production webpack
我们称它为类 Posix 解释器,而不是兼容 Posix 的解释器,因为它没有实现一些最复杂的功能,这些功能在 scripts
字段的上下文中没有用。例如,不支持多行流程控制结构,如 while
。
脚本参数
默认情况下,yarn run
中脚本名称后面的任何参数都将添加到已评估的命令中。它在简单的情况下运行得很好,就像这样,运行 yarn test packages/lib
将导致评估 jest packages/lib
{
"scripts": {
"test": "jest"
}
}
然而,在更复杂的情况下,你可能希望明确引用那些参数。Yarn 通过使用 $0
、$1
等变量来支持这一点,这些变量将被内插,并禁用参数的自动追加
{
"scripts": {
"get-latest": "curl https://registry.yarnpkg.com/$0 | jq .['dist-tags'].latest"
}
}
当然,你还可以使用 $@
数组来检索所有参数的列表,这将允许你在多个命令中重复使用它们
{
"scripts": {
"build-and-test": "yarn build \"$@\" && yarn test \"$@\""
}
}