lerna - 功能点
# 运行任务
Monorepos可以有数百甚至数千个项目,所以能够对所有(或部分)项目运行npm脚本是Lerna这样的工具的一个关键特性。
# 定义
- Command - 开发者在终端中键入的任何内容 (e.g.,
lerna run build --scope=header --concurrency=5
) - Target - npm脚本的名称(e.g.,
build
) - Task - npm脚本的调用(e.g.,
header:build
).
# 示例仓库
# 运行内容
每个项目都定义了test
和build
脚本。
run:
npx lerna run build
这将以正确的顺序构建项目: footer
and header
and then remixapp
.
✔ header:build (501ms)
✔ footer:build (503ms)
✔ remixapp:build (670ms)
—————————————————————————————————————————————————————————————————————————————
> Lerna (powered by Nx) Successfully ran target build for 3 projects (1s)
2
3
4
5
6
7
8
请注意,Lerna并不关心每个构建脚本的作用。名称build也不特殊:它只是npm脚本的名称。
# 同时运行多个任务
您可以传递一个逗号分隔的目标列表,其中列出了您希望触发并发运行的目标。
npx lerna run test,build,lint
例如,如果您的任务之间存在依赖关系,例如需要在测试特定包之前运行构建,那么只要您配置了适当的任务管道配置,任务运行器就会为您协调这一点。
# 为单个包运行任务
在开发时,您很少运行所有构建或所有测试。相反,您通常只针对正在更改的项目进行操作。例如,您可以这样运行头测试:
npx lerna run test --scope=header
# 运行受PR影响的任务
您还可以为PR中受影响的所有项目运行命令,如下所示:
npx lerna run test --since=origin/main
Learn more here (opens new window).
# 控制任务的运行方式 (opens new window)
要更好地控制执行任务的顺序,请编辑Task Pipeline Configuration (opens new window)。
要加快任务执行速度,请了解如何缓存任务结果 (opens new window)和分配任务执行 (opens new window)
# 自动加载 .env文件 (opens new window)
默认情况下,由 Nx 提供支持的现代任务运行器将自动.env
为您加载文件。--load-env-files
如果您出于任何原因想要禁用此行为,您可以设置为 false。
有关.env
默认加载哪些文件的更多详细信息,请参阅:https://nx.dev/recipes/environment-variables/define-environment-variables (opens new window)
# 版本和发布
Lerna 可以增加您的包的版本以及将您的包发布到 NPM,它提供了多种选项以确保可以适应任何工作流程。
为了展示 Lerna 是如何做到的,我们将查看这个存储库 (opens new window)。
如果您通过实践学得更好,请克隆 repo 并继续学习。
回购协议包含三个包或项目:
header
(React 组件库)footer
(React 组件库)remixapp
(使用依赖于header
和的 Remix 框架编写的应用程序footer
)
我们将发布header
和footer
包。
只发布项目的一个子集是很常见的。有些项目可以是私有的(例如,仅用于测试),有些可以是演示应用程序。在这个 repo 中,
remixapp
它不是私有的,它只是没有发布到 NPM。
# 版本控制 (opens new window)
Lerna 附带一个version
命令,允许您增加包的版本号、提交更改并相应地标记它们。
lerna version --no-private
你会得到以下输出:
lerna notice cli v5.1.2
lerna info current version 1.0.0
lerna info Assuming all packages changed
? Select a new version (currently 1.0.0) (Use arrow keys)
❯ Patch (1.0.1)
Minor (1.1.0)
Major (2.0.0)
Prepatch (1.0.1-alpha.0)
Preminor (1.1.0-alpha.0)
Premajor (2.0.0-alpha.0)
Custom Prerelease
Custom Version
2
3
4
5
6
7
8
9
10
11
12
信息
请注意,通过传递,我们排除了在其文件--no-private
中标记的所有包。private``package.json
Lerna 检测当前包,识别当前版本并建议下一个选择。请注意,您也可以像lerna version 1.0.0
. 有关版本文档详细信息 (opens new window)的更多信息。一旦选择了给定的版本,Lerna 就会package.json
用版本号更新,提交更改,添加相应的版本标签(例如v1.0.0
)并将提交和标签推送到远程存储库。
包/页脚/package.json
{
"name": "footer",
"version": "1.0.1",
"main": "dist/index.js",
...
}
2
3
4
5
6
请注意,上述操作不会将包推送到任何 NPM 存储库。相反,如果我们还希望 Lerna 负责发布过程,我们可以使用lerna publish
instead。
信息
lerna使用in的version
属性lerna.json
来判断当前使用的版本
# 发布到NPM (opens new window)
如果我们跑
lerna publish --no-private
Lerna 执行版本递增工作流(与 相同lerna version
),此外还将包推送到 NPM。您应该得到以下输出:
终端输出
lerna notice cli v5.1.2
lerna info current version 1.0.0
lerna info Assuming all packages changed
? Select a new version (currently 1.0.0) Patch (1.0.1)
Changes:
- footer: 1.0.0 => 1.0.1
- header: 1.0.0 => 1.0.1
? Are you sure you want to publish these packages? Yes
lerna info execute Skipping releases
lerna info git Pushing tags...
lerna info publish Publishing packages to npm...
...
lerna success published header 1.0.1
...
lerna success published footer 1.0.1
...
Successfully published:
- footer@1.0.1
- header@1.0.1
lerna success published 2 packages
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 版本控制策略 (opens new window)
Lerna 允许您使用两种模式之一来管理您的项目:固定或独立。
# 固定/锁定模式(默认) (opens new window)
固定模式 Lerna 项目在单个版本行上运行。该版本保存在lerna.json
项目根目录下的文件中version
。当您运行 时lerna publish
,如果模块自上次发布以来已更新,它将更新为您发布的新版本。这意味着您只在需要时发布包的新版本。
注意:如果您的主要版本为零,则所有更新都被视为中断 (opens new window)。因此,
lerna publish
以零主版本运行并选择任何非预发布版本号将导致为所有包发布新版本,即使自上次发布以来并非所有包都发生了变化。
如果您想自动将所有包版本绑定在一起,请使用此选项。这种方法的一个问题是任何包中的重大更改都会导致所有包都具有新的主要版本。
# 独立模式 (opens new window)
npx lerna init --independent
独立模式 Lerna 项目允许维护者彼此独立地增加包版本。每次发布时,您都会收到针对每个已更改包的提示,以指定它是补丁、次要、主要还是自定义更改。
独立模式允许您更具体地更新每个包的版本,并且对一组组件有意义。将这种模式与语义释放 (opens new window)之类的东西结合起来会减轻它的痛苦。(在atlassian/lerna-semantic-release (opens new window)已经有这方面的工作)。
将
version
键设置lerna.json
为independent
以独立模式运行。