跳至主要内容
非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

配置

Lerna 的配置分为两个文件:lerna.jsonnx.json

lerna.json

npmClient

若未使用 npm 作为包管理器(例如使用 yarnpnpm),则必须设置此值,以便 Lerna 在解析配置和包时调整其内部逻辑。对于 pnpm 尤其重要,因为它使用单独的 pnpm-workspaces.yaml 文件定义工作区配置。

packages

默认情况下,Lerna 会尝试复用所选包管理器中的 workspaces 配置。若需指定 Lerna 操作的可用包子集,可使用 packages 属性告知 Lerna 查找 package.json 文件的位置。

lerna.json
{
"packages": ["packages/*"]
}

version

Lerna 有两种包发布模式:fixed(固定)和 independent(独立)。固定模式下,所有受影响包将使用相同版本发布。最后发布的版本会记录在 lerna.json 中,如下所示:

lerna.json
{
"version": "1.2.0"
}

独立模式下,每个包单独进行版本控制,lerna.json 将如下所示:

lerna.json
{
"version": "independent"
}

详见版本与发布文档

commands

lerna.json 文件也可为每个命令配置选项,例如:

{
"command": {
"version": {
"allowBranch": "main",
"conventionalCommits": true
}
}
}

可用选项参见命令 API 文档

nx.json

注意:"{projectRoot}" 和 "{workspaceRoot}" 是任务执行器支持的特殊语法,命令运行时将在内部自动解析。请勿将其替换为固定路径,否则会降低配置灵活性。

nx.json
{
"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 中更实用。

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 中的 namedInputstargetDefaults 仅是默认值。若将此配置复制到每个项目的 package.json 中,效果完全相同。

换言之,每个项目的命名输入集定义为:{...namedInputsFromNxJson, ...namedInputsFromProjectsPackageJson}。每个目标脚本的 dependsOn 定义为:dependsOnFromProjectsPackageJson || dependsOnFromNxJson。此规则同样适用于 inputsoutputs

输入(inputs)与命名输入(namedInputs)

为特定目标定义 inputs 将覆盖 nx.json 中该目标名的输入集,伪代码表示为:inputs = packageJson.targets.build.inputs || nxJson.targetDefaults.build.inputs

你还可以定义/重定义命名输入。这实现了一个关键场景:在 nx.json 中设置通用配置(适用于所有项目):

"test": {
"inputs": [
"default",
"^prod"
]
}

各项目可自定义生产环境文件集,而无需为 test 目标重复定义输入规则。

package.json
{
"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 文档