跳至主要内容
非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

传统包管理

备注

在 2025 年 9 月发布的 lerna v9 中,lerna bootstraplerna addlerna link 命令在废弃超过两年后最终被完全移除。 如果您仍在使用这些命令,请迁移至包管理器长期支持的 workspaces 功能。

以下指南将提供背景信息,并帮助您理解迁移的原因和方法。

早在 2023 年 6 月的 lerna v7.0.0 中,我们已默认移除了 lerna bootstraplerna addlerna link 命令。两年多后,在 lerna v9.0.0 中,这些命令最终被完全移除。

本节介绍如何最佳迁移这些命令,并使用包管理器的 workspaces 功能现代化您的配置。关于_为何_需要此变更的完整背景,请参阅下方的背景说明

关键认知转变在于:lerna 不再负责安装和链接仓库中的依赖项,您的包管理器更适合此任务。

实现方式是通过使用包管理器的 workspaces 功能。相关文档如下:

使用 workspaces 后,包管理器将执行与 lerna bootstraplerna link 完全相同的链接操作,但该功能已直接集成到 install 命令中。只要按上述文档配置好 workspaces,安装后无需再运行额外命令。

替换 lerna add 同理。添加和移除依赖本就是包管理器的职责,且因 workspaces 是一等公民功能,您只需运行对应的 install 命令为特定包/工作区添加依赖,所有相关本地链接将自动完成。

下方提供更具体的对比及迁移前后的用法示例。

功能说明

lerna bootstrap 曾用于替代 npm install(或 yarn/pnpm)。它会安装所有外部包并链接工作区内的所有内部包。lerna link 仅执行此操作中的内部链接步骤。

使用位置

通常出现在工作区根目录 package.json 的 "scripts" 属性中。同时请检查 CI 流水线,它们可能也使用 lerna bootstrap 替代了 npm install(或 yarn/pnpm)。

替代方案

lerna bootstrap 替换为 npm install(或 yarn/pnpm)。若您的工作流中已有包管理器的安装命令,直接删除 lerna bootstrap 即可。lerna link 可完全移除,因为链接步骤现由包管理器在 npm install 过程中处理。

信息

若您使用 yarn 且依赖二进制文件链接,切换到 workspaces 后可能需要手动删除一次 node_modules 目录。详情参阅此 yarn issue

替换 lerna add 的使用

功能说明

lerna add 曾用于向工作区中的包添加依赖,它会更新各包的 package.json 文件。

使用位置

虽然通常手动调用,但 lerna add 可能出现在工作区根目录 package.json 的某些脚本中。

替代方案

lerna add 在大多数情况下可以被 npm install(或 yarn/pnpm)的变体替代。lerna add 最常见的用途是为工作区内的单个包添加依赖项,命令格式如下:

lerna add <dependency> --scope <package>

可直接替换为:

npm install <dependency> -w <package>

-w 标志指示 npm 仅将依赖项安装到 <package> 指定的工作区包中,类似于 Lerna 的 --scope 选项。

如需为多个包添加依赖项,可多次使用 -w 选项:

npm install <dependency> -w <package1> -w <package2>

自定义提升(Hoisting)

Lerna 旧版 bootstrap 命令的优势之一在于它允许灵活控制依赖项的提升:可将特定依赖项提升到仓库根目录,或保留在嵌套位置。

因此,如果您当前的包提升配置较为复杂,可能会对迁移 lerna bootstrap 有所顾虑。

根据我们测试各包管理器的经验,现代 yarn(即 v3 及以上版本)在提升控制方面提供了最大的灵活性:

https://yarnpkg.com/configuration/yarnrc/#nmHoistingLimits

目前尚未发现任何使用 lerna bootstrap 的仓库(无论提升配置多复杂)无法迁移到现代 yarn 的情况。若您有此需求,请尝试迁移。

如果您的 lerna bootstrap 未涉及高级提升配置,可自由选择任意包管理器,它们均提供成熟的 workspaces 实现。

临时兼容旧版包管理命令

如果您在 v7 或 v8 版本中确实需要旧版包管理命令(lerna bootstraplerna addlerna link),可以安装与您当前 lerna 包版本相同的 @lerna/legacy-package-management 包,该包通过旧实现提供了这些命令。

需要特别说明的是,这仅是临时解决方案,该包从发布起即处于仅维护模式——不再为旧版包管理功能(如 lerna bootstraplerna addlerna link)开发新特性,但我们仍会合并关键补丁和安全更新。

在作为临时解决方案引入两年多后,v9 版本完全移除了对 @lerna/legacy-package-management 的支持,为团队提供了充足的迁移时间。

背景说明

Lerna 是 JavaScript 生态中最早的单仓库(monorepo)/工作区管理工具。在 2015/2016 年创建之初,整个生态截然不同,原生缺乏处理多包仓库(即 "workspace")的能力。因此 lerna bootstraplerna addlerna link 等命令成为 Lerna 的核心功能——当时别无选择。

但事实是,多年来我们所熟知的包管理器(npmyarnpnpm)都已将工作区(workspaces)概念作为一等公民功能完全支持。

它们经过实战检验的实现方案,能够自然地处理本地包的添加、删除、链接,并与第三方依赖无缝集成。

正因如此,在 Daniel(Lerna 前首席维护者)执掌项目的最后几年,他一直强烈建议用户重新评估对 Lerna 旧版包管理命令的使用,转而充分发挥所选包管理器的原生能力。

我们早已了解这一背景,但作为2022年接手项目的新任维护者,我们不愿贸然行动,在未深入了解实际情况前就移除功能。经过一段时间的积极维护,我们完全赞同Daniel及其他成员的观点:lerna中的传统包管理命令确实需要淘汰。

通过移除这些在包管理器中已有更优原生替代方案的旧版功能,我们和 lerna 社区现在得以集中精力优化 lerna 最具价值的功能(例如但不限于版本管理和发布),并将其做到极致!

信息

此背景同样在Lerna v7讨论中有所阐述。如有任何具体疑虑,欢迎加入讨论并尽可能提供详细信息!