本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →
配置
Lerna 的配置分为两个文件:lerna.json 和 nx.json。
lerna.json
npmClient
若未使用 npm 作为包管理器(例如使用 yarn 或 pnpm),则必须设置此值,以便 Lerna 在解析配置和包时调整其内部逻辑。对于 pnpm 尤其重要,因为它使用单独的 pnpm-workspaces.yaml 文件定义工作区配置。
packages
默认情况下,Lerna 会尝试复用所选包管理器中的 workspaces 配置。若需指定 Lerna 操作的可用包子集,可使用 packages 属性告知 Lerna 查找 package.json 文件的位置。
{
"packages": ["packages/*"]
}
version
Lerna 有两种包发布模式:fixed(固定)和 independent(独立)。固定模式下,所有受影响包将使用相同版本发布。最后发布的版本会记录在 lerna.json 中,如下所示:
{
"version": "1.2.0"
}
独立模式下,每个包单独进行版本控制,lerna.json 将如下所示:
{
"version": "independent"
}
详见版本与发布文档。
commands
lerna.json 文件也可为每个命令配置选项,例如:
{
"command": {
"version": {
"allowBranch": "main",
"conventionalCommits": true
}
}
}
可用选项参见命令 API 文档。
nx.json
注意:"{projectRoot}" 和 "{workspaceRoot}" 是任务执行器支持的特殊语法,命令运行时将在内部自动解析。请勿将其替换为固定路径,否则会降低配置灵活性。
{
"namedInputs": {
"default": ["{projectRoot}/**/*"],
"prod": ["!{projectRoot}/**/*.spec.tsx"]
},
"targetDefaults": {
"build": {
"dependsOn": ["prebuild", "^build"],
"inputs": ["prod", "^prod"],
"outputs": ["{projectRoot}/dist"],
"cache": true
},
"test": {
"inputs": ["default", "^prod", "{workspaceRoot}/jest.config.ts"],
"cache": true
}
}
}
目标默认值
目标即 npm 脚本名称。您可在 targetDefaults 部分为仓库中各项目(例如构建脚本)添加关联元数据。
cache
设为 true 时告知 Nx 缓存脚本运行结果。大多数仓库中,所有非长时间运行任务(例如非 serve 任务)都应可缓存。
依赖(dependsOn)
目标可依赖其他目标。常见场景是构建项目前需先构建其依赖项。dependsOn 属性用于定义单个目标的依赖关系。
"dependsOn": [ "prebuild", "^build"] 告知 Nx:每个构建脚本需先运行同项目的 prebuild 脚本及所有依赖项的 build 脚本。
输入(inputs)与命名输入(namedInputs)
inputs 数组告知 Nx 如何判定特定脚本调用是否应视为缓存命中。共有三种输入类型:
文件集
示例:
-
{projectRoot}/**.*.ts -
等同于
{fileset: "{projectRoot}/**/*.ts"} -
{workspaceRoot}/jest.config.ts -
等同于
{fileset: "{workspaceRoot}/jest.config.ts}
运行时输入
示例:
{runtime: "node -v"}
注意:结果值会被哈希处理,因此永远不会显示。
环境变量
示例:
{env: "MY_ENV_VAR"}
注意:结果值会被哈希处理,因此永远不会显示。
命名输入(Named Inputs)
示例:
-
inputs: ["prod"] -
等同于
inputs: [{input: "prod", projects: "self"}]
通常相同的 glob 模式会出现在多个地方(例如生产环境文件集会排除所有项目的测试文件)。由于保持它们同步容易出错,我们建议定义命名输入,这样便可在所有相关位置引用这些预定义配置。
使用 ^ 符号
示例:
-
inputs: ["^prod"] -
等同于
inputs: [{input: "prod", projects: "dependencies"}]
与 dependsOn 类似,符号 "^" 表示"依赖项"。这个概念非常重要,我们通过示例来说明:
"test": {
"inputs": [ "default", "^prod" ]
}
上述配置意味着测试目标依赖于给定项目的所有源文件,且仅依赖其依赖项的生产环境源文件(非测试源文件)。换言之,它将测试源文件视为私有资源。若 remixapp 项目依赖 header 库,修改 header 的测试文件将不会触发 remixapp 的测试目标重新执行。
输出(outputs)
"outputs": ["{projectRoot}/dist"] 告知 Nx 构建脚本的输出位置。该值实际上是默认设置,因此本例中可省略。"outputs": [] 表示测试目标不会生成磁盘工件。可列出任意数量输出路径,也支持 glob 模式或单个文件路径。
通常无需此配置,Nx 已内置实现上述配置的合理默认值。
项目特定配置
对于项目相似的工作区,nx.json 通常包含完整的 Nx 配置。但有时将项目特定配置放在其 package.json 中更实用。
{
"name": "parent",
"scripts": {
"build": "...",
"test": "..."
},
"dependencies": {...},
"nx": {
"namedInputs": {
"prod": [
"!{projectRoot}/**/*.test.tsx",
"{workspaceRoot}/configs/webpack.conf.js"
]
},
"targets": {
"build": {
"dependsOn": [
"^build"
],
"inputs": [
"prod",
"^prod"
],
"outputs": [
"{workspaceRoot}/dist/parent"
]
}
}
"implicitDependencies": ["projecta", "!projectb"]
}
}
注意:nx.json 中的 namedInputs 和 targetDefaults 仅是默认值。若将此配置复制到每个项目的 package.json 中,效果完全相同。
换言之,每个项目的命名输入集定义为:{...namedInputsFromNxJson, ...namedInputsFromProjectsPackageJson}。每个目标脚本的 dependsOn 定义为:dependsOnFromProjectsPackageJson || dependsOnFromNxJson。此规则同样适用于 inputs 和 outputs。
输入(inputs)与命名输入(namedInputs)
为特定目标定义 inputs 将覆盖 nx.json 中该目标名的输入集,伪代码表示为:inputs = packageJson.targets.build.inputs || nxJson.targetDefaults.build.inputs。
你还可以定义/重定义命名输入。这实现了一个关键场景:在 nx.json 中设置通用配置(适用于所有项目):
"test": {
"inputs": [
"default",
"^prod"
]
}
各项目可自定义生产环境文件集,而无需为 test 目标重复定义输入规则。
{
"name": "parent",
"scripts": {
"build": "...",
"test": "..."
},
"dependencies": {...},
"nx": {
"namedInputs": {
"prod": [
"!{projectRoot}/**/*.test.js",
"{workspacRoot}/jest.config.js"
]
}
}
}
此时 Nx 会自动为每个项目采用正确的 prod 输入集。
依赖(dependsOn)
为特定目标定义 dependsOn 将覆盖 nx.json 中该目标名的 dependsOn,伪代码表示为:dependsOn = packageJson.targets.build.dependsOn || nxJson.targetDefaults.build.dependsOn。
输出(outputs)
为特定目标定义 outputs 会覆盖在 nx.json 中为该目标名称定义的 outputs 配置。
使用伪代码表示为 outputs = packageJson.targets.build.outputs || nxJson.targetDefaults.build.outputs。
implicitDependencies
配置项 "implicitDependencies": ["projecta", "!projectb"] 表示父项目隐式依赖 projecta(即使其 package.json 中未声明),Nx 将按显式依赖的规则处理该依赖关系。同时该配置明确告知 Nx 忽略对 projectb 的显式依赖。
额外配置
关于任务配置与缓存的更多方法,请参阅相关 Nx 文档。