跳到主要内容

版本和发布

Lerna 可以增加您的包的版本,并将包发布到 NPM,并提供各种选项以确保可以适应任何工作流。

为了展示 Lerna 是如何做到的,我们将查看此仓库

如果您通过实践学习更好,请克隆仓库并跟随。

该仓库包含三个包或项目:

  • header(React 组件库)
  • footer(React 组件库)
  • remixapp(使用 Remix 框架编写的应用,依赖于 headerfooter

我们将发布 headerfooter 包。

发布仅部分项目是很常见的。有些项目可能是私有的(例如,仅用于测试),有些可能是演示应用。在这个仓库中,remixapp 并不是"私有的",意味着不希望人们看到源文件,而是使用 "private": true 设置以避免发布到 NPM。

版本控制

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
? 选择一个新版本(当前为 1.0.0) (使用箭头键)
❯ 补丁版本 (1.0.1)
次要版本 (1.1.0)
主要版本 (2.0.0)
预补丁版本 (1.0.1-alpha.0)
预次要版本 (1.1.0-alpha.0)
预主要版本 (2.0.0-alpha.0)
自定义预发布版本
自定义版本
信息

请注意,通过传递 --no-private 我们排除了在其 package.json 文件中标记为 private 的所有包。

Lerna 检测当前包,识别当前版本并提出下一个版本供选择。请注意,您也可以直接传递语义版本增量,如 lerna version 1.0.0。更多详细信息请参见版本文档。选择给定版本后,Lerna 会使用版本号更新 package.json,提交更改,添加相应的版本标签(例如 v1.0.0)并将提交和标签推送到远程仓库。

packages/footer/package.json
{
"name": "footer",
"version": "1.0.1",
"main": "dist/index.js",
...
}

请注意,上述操作不会将包推送到任何 NPM 仓库。如果我们希望 Lerna 也负责发布过程,可以改用 lerna publish

信息

Lerna 使用 lerna.json 中的 version 属性来确定当前使用的版本

发布到 NPM

如果我们运行

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
? 选择一个新版本(当前为 1.0.0) 补丁版本 (1.0.1)

更改:
- footer: 1.0.0 => 1.0.1
- header: 1.0.0 => 1.0.1

? 您确定要发布这些包吗? 是
lerna info execute 跳过发布
lerna info git 推送标签...
lerna info publish 发布包到 npm...
...
lerna success published header 1.0.1
...
lerna success published footer 1.0.1
...
成功发布:
- footer@1.0.1
- header@1.0.1
lerna success published 2 个包

from-package

Lerna 确定要发布的包的另一种方式是使用 from-package。Lerna 将比较仓库中每个包的版本与其在 npm 上发布的版本。对于每个版本大于已发布版本的包,Lerna 将把该包发布到 npm。

此模式不明确要求包已使用 lerna version 进行版本控制,这使其非常适合具有自己的版本控制脚本的工作空间。

lerna publish from-package
信息

Lerna 始终 使用 npm 发布包。如果您使用 npm 以外的包管理器,即使在 lerna.json 中将 npmClient 设置为其他值,您仍需要在 .npmrc 中添加适当的发布配置。

版本控制策略

Lerna 允许您使用两种模式之一管理项目:固定模式或独立模式。

固定/锁定模式(默认)

固定模式的 Lerna 项目在单一版本线上运行。版本保存在项目根目录的 lerna.json 文件中的 version 键下。当您运行 lerna publish 时,如果自上次发布以来包已更新,它将更新为您正在发布的新版本。这意味着您只在需要时发布包的新版本。

注意:如果主版本为零,所有更新都被视为破坏性的。因此,使用主版本零运行 lerna publish 并选择任何非预发布版本号将导致为所有包发布新版本,即使并非所有包自上次发布以来都有变更。

如果您希望自动将所有包版本绑定在一起,请使用此模式。这种方法的一个问题是任何包中的主要更改都将导致所有包具有新的主要版本。

同步版本

Lerna 只会对自上次发布以来发生变更的包进行版本控制和发布,导致包版本随时间推移而分散。要防止这种情况,请在 lerna version 中使用 --force-publish 选项。这将强制 Lerna 始终对所有包进行版本控制,无论它们自上次发布以来是否有变更。然后,它们将通过 lerna publish from-git 发布到注册表。因此,所有包版本将保持与 lerna.json 中的版本同步。

独立模式

npx lerna init --independent

独立模式的 Lerna 项目允许维护者独立地增加每个包的版本。每次发布时,您将收到已更改的每个包的提示,以指定是补丁、次要、主要还是自定义更改。

独立模式允许您更具体地为每个包更新版本,并且对于一组组件来说很有意义。将此模式与类似 semantic-release 的工具结合使用会使过程不那么痛苦。(已经有关于此的工作在 atlassian/lerna-semantic-release)。

lerna.json 中将 version 键设置为 independent 以在独立模式下运行。