配置
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}”是任务运行器支持的特殊语法,在命令运行时会在内部进行适当的插值。因此,您不应将“{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 脚本以及所有依赖项的构建脚本。
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"}
节点结果值被哈希化,因此永远不会显示。
命名输入
示例
inputs: ["prod"]
- 与
inputs: [{input: "prod", projects: "self"}]
相同
通常,相同的 glob 会出现在很多地方(例如,prod 文件集将排除所有项目的规范文件)。由于保持它们同步容易出错,因此我们建议定义命名输入,然后您可以在所有这些地方引用它们。
使用 ^
示例
inputs: ["^prod"]
- 与
inputs: [{input: "prod", projects: "dependencies"}]
相同
类似于 dependsOn
,“^”符号表示“依赖项”。这是一个非常重要的概念,让我们用一个例子来说明它。
"test": {
"inputs": [ "default", "^prod" ]
}
上面的配置意味着测试目标依赖于给定项目的全部源文件及其依赖项的仅 prod 源文件(非测试源文件)。换句话说,它将测试源文件视为私有。如果您的 remixapp
项目依赖于 header
库,则更改 header
测试将不会对 remixapp
测试目标产生任何影响。
outputs
"outputs": ["{projectRoot}/dist"]
告诉 Nx 构建脚本将在哪里创建文件工件。提供的值实际上是默认值,因此在这种情况下我们可以省略它。"outputs": []
告诉 Nx 测试目标不会在磁盘上创建任何工件。您可以列出任意多个输出。您还可以使用 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"
]
}
项目可以定义其 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"]
行告诉 Nx 父项目依赖于 projecta
,即使其 package.json
中没有依赖项。Nx 将以与处理显式依赖项相同的方式处理此类依赖项。它还告诉 Nx 即使存在对 projectb
的显式依赖项,也应忽略它。
其他配置
有关配置任务和缓存的其他方法,请参阅相关的Nx 文档。