本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →
版本管理与发布
Lerna 能够递增您的软件包版本号,同时支持将软件包发布到 NPM。它提供了多种选项以满足不同工作流程的需求。
我们将通过这个示例仓库来演示 Lerna 的操作流程。
如果您更习惯动手实践,请克隆该仓库并跟随操作。
该仓库包含三个软件包/项目:
-
header(React 组件库) -
footer(React 组件库) -
remixapp(基于 Remix 框架开发的应用程序,依赖header和footer)
我们将发布 header 和 footer 这两个软件包。
通常只需发布部分项目:有些项目可能是私有项目(例如仅用于测试),有些可能是演示应用。本仓库中的
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
? 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),并将提交和标签推送到远程仓库。
{
"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:
- footer@1.0.1
- header@1.0.1
lerna success published 2 packages
from-package 模式
Lerna 还支持通过 from-package 模式确定要发布的软件包。该模式会对比仓库中每个软件包的版本号与已发布到 npm 的版本。对于本地版本高于 npm 已发布版本的软件包,Lerna 会将其发布到 npm。
此模式不强制要求使用 lerna version 进行版本管理,因此非常适合拥有自定义版本管理脚本的工作区。
lerna publish from-package
Lerna 始终使用 npm 发布软件包。如果您使用的包管理器不是 npm,那么即使您在 lerna.json 中将 npmClient 设置为 npm 以外的值,也仍然需要在 .npmrc 中添加正确的发布配置。
版本管理策略
Lerna 提供两种管理模式:固定模式(Fixed)或独立模式(Independent)。
固定/锁定模式(默认)
在固定模式下,Lerna 项目采用单一版本线管理。版本号保存在项目根目录的 lerna.json 文件中(位于 version 字段下)。当执行 lerna publish 时,若某个包自上次发布后有更新,该包将升级到您要发布的新版本。这意味着您只需在需 要时才发布包的新版本。
注意:若主版本号为 0(零),所有更新均被视为破坏性变更。因此,当主版本号为 0 时执行
lerna publish并选择非预发布版本号,即使某些包自上次发布后未作修改,也会触发所有包的新版本发布。
此模式适用于需要自动同步所有包版本的场景。但需注意:任何包的破坏性变更(major 更新)都会导致所有包的主版本号升级。
版本同步机制
默认情况下,Lerna 仅对上次发布后有变更的包进行版本管理和发布,可能导致各包版本逐渐偏离。为避免此问题,可在执行 lerna version 时添加 --force-publish 参数。这将强制 Lerna 始终更新所有包的版本(无论是否有变更)。后续通过 lerna publish from-git 发布时,所有包版本将保持与 lerna.json 中版本号严格同步。
独立模式
npx lerna init --independent
独立模式允许维护者为每个包单独管理版本号。每次发布时,系统会为每个变更包弹出提示,供您选择版本更新类型(patch/minor/major)或自定义版本。
此模式支持更精细的包版本控制,特别适合组件库场景。结合使用semantic-release等工具可大幅简化流程(相关实践可参考atlassian/lerna-semantic-release项目)。
将
lerna.json中的version字段设为independent即可启用独立模式。