跳至主要内容

版本和发布

Lerna 可以递增包的版本,以及将包发布到 NPM,并且它提供了各种选项以确保可以满足任何工作流程。

为了展示 Lerna 的工作原理,我们将查看此存储库

如果您通过实践学习效果更好,请克隆存储库并跟随操作。

该存储库包含三个包或项目

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

我们将发布 headerfooter 包。

通常只发布项目的一个子集。一些项目可以是私有的(例如,仅用于测试),一些可以是演示应用程序。在此存储库中,remixapp 从不想让人们看到源文件意义上并非“私有”,它只是为了不发布到 NPM 而使用了 "private": true 设置。

版本控制

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
信息

请注意,通过传递 --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
? 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:
- [email protected]
- [email protected]
lerna success published 2 packages

from-package

Lerna 确定要发布哪些包的另一种方法是使用 from-package。Lerna 将比较存储库中每个包的版本与其发布到 npm 的版本。对于版本大于已发布版本的每个包,Lerna 将将其发布到 npm。

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

lerna publish from-package
信息

Lerna 始终使用 npm 发布包。如果您使用除 npm 之外的包管理器,则即使 lerna.json 中的 npmClient 设置为除 npm 之外的其他内容,也仍然需要将相应的发布配置添加到 .npmrc 中。

版本控制策略

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

固定/锁定模式(默认)

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

注意:如果您有主要版本零,则所有更新都被视为重大更改。因此,使用主要版本零运行 lerna publish 并选择任何非预发布版本号将导致所有包发布新版本,即使并非所有包自上次发布以来都已更改。

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

同步版本

Lerna 将仅对自上次发布以来已更改的包进行版本控制和发布,导致包版本随着时间的推移而发生偏差。要防止这种情况,请将 --force-publish 选项与 lerna version 一起使用。这将强制 Lerna 始终对所有包进行版本控制,而不管它们自上次发布以来是否已更改。然后,它们都将由 lerna publish from-git 发布到注册表。因此,所有包版本将保持与 lerna.json 中的版本同步。

独立模式

npx lerna init --independent

独立模式 Lerna 项目允许维护人员独立于彼此递增包版本。每次发布时,您都会收到一条提示,提示每个已更改的包,以指定它是补丁、次要、主要还是自定义更改。

独立模式允许您更具体地更新每个包的版本,并且对于一组组件很有意义。将此模式与semantic-release 等工具结合使用会使其不那么痛苦。(此方面的工作已在atlassian/lerna-semantic-release 中进行)。

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