配置
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" ]
}
上面的配置意味着测试目标依赖于给定项目的所有源文件和其依赖项的仅生产源(非测试源)。换句话说,它将测试源视为私有。如果您的 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"
]
}
}
}
In this case Nx will use the right prod
input for each project.
dependsOn
Defining dependsOn
for a given target would replace dependsOn
for that target name defined in nx.json
.
Using pseudocode dependsOn = packageJson.targets.build.dependsOn || nxJson.targetDefaults.build.dependsOn
.
outputs
Defining outputs
for a given target would replace outputs
for that target name defined in nx.json
.
Using pseudocode outputs = packageJson.targets.build.outputs || nxJson.targetDefaults.build.outputs
.
implicitDependencies
The "implicitDependencies": ["projecta", "!projectb"]
line tells Nx that the parent project depends on projecta
even
though there is no dependency in its package.json
. Nx will treat such a dependency in the same way it treats explicit
dependencies. It also tells Nx that even though there is an explicit dependency on projectb
, it should be ignored.
Additional Configuration
For additional ways to configure tasks and caching, see the relevant Nx documentation.