本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →
传统包管理
在 2025 年 9 月发布的 lerna v9 中,lerna bootstrap、lerna add 和 lerna link 命令在废弃超过两年后最终被完全移除。
如果您仍在使用这些命令,请迁移至包管理器长期支持的 workspaces 功能。
以下指南将提供背景信息,并帮助您理解迁移的原因和方法。
从 lerna v7 及更高版本迁移 lerna bootstrap、lerna add 和 lerna link
早在 2023 年 6 月的 lerna v7.0.0 中,我们已默认移除了 lerna bootstrap、lerna add 和 lerna link 命令。两年多后,在 lerna v9.0.0 中,这些命令最终被完全移除。
本节介绍如何最佳迁移这些命令,并使用包管理器的 workspaces 功能现代化您的配置。关于_为何_需要此变更的完整背景,请参阅下方的背景说明。
关键认知转变在于:lerna 不再负责安装和 链接仓库中的依赖项,您的包管理器更适合此任务。
实现方式是通过使用包管理器的 workspaces 功能。相关文档如下:
-
pnpm(https://pnpm.io/workspaces)
使用 workspaces 后,包管理器将执行与 lerna bootstrap 和 lerna link 完全相同的链接操作,但该功能已直接集成到 install 命令中。只要按上述文档配置好 workspaces,安装后无需再运行额外命令。
替换 lerna add 同理。添加和移除依赖本就是包管理器的职责,且因 workspaces 是一等公民功能,您只需运行对应的 install 命令为特定包/工作区添加依赖,所有相关本地链接将自动完成。
下方提供更具体的对比及迁移前后的用法示例。
替换 lerna bootstrap/lerna link 的使用
功能说明
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 bootstrap、lerna add 和 lerna link),可以安装与您当前 lerna 包版本相同的 @lerna/legacy-package-management 包,该包通过旧实现提供了这些命令。
需要特别说明的是,这仅是临时解决方案,该包从发布起即处于仅维护模式——不再为旧版包管理功能(如 lerna bootstrap、lerna add 和 lerna link)开发新特性,但我们仍会合并关键补丁和安全更新。
在作为临时解决方案引入两年多后,v9 版本完全移除了对 @lerna/legacy-package-management 的支持,为团队提供了充足的迁移时间。
背景说明
Lerna 是 JavaScript 生态中最早的单仓库(monorepo)/工作区管理工具。在 2015/2016 年创建之初,整个生态截然不同,原生缺乏处理多包仓库(即 "workspace")的能力。因此 lerna bootstrap、lerna add 和 lerna link 等命令成为 Lerna 的核心功能——当时别无选择。
但事实是,多年来我们所熟知的包管理器(npm、yarn 和 pnpm)都已将工作区(workspaces)概念作为一等公民功能完全支持。
它们经过实战检验的实现方案,能够自然地处理本地包的添加、删除、链接,并与第三方依赖无缝集成。
正因如此,在 Daniel(Lerna 前首席维护者)执掌项目的最后几年,他一直强烈建议用户重新评估对 Lerna 旧版包管理命令的使用,转而充分发挥所选包管理器的原生能力。
我们早已了解这一背景,但作为2022年接手项目的新任维护者,我们不愿贸然行动,在未深入了解实际情况前就移除功能。经过一段时间的积极维护,我们完全赞同Daniel及其他成员的观点:lerna中的传统包管理命令确实需要淘汰。
通过移除这些在包管理器中已有更优原生替代方案的旧版功能,我们和 lerna 社区现在得以集中精力优化 lerna 最具价值的功能(例如但不限于版本管理和发布),并将其做到极致!
此背景同样在Lerna v7讨论中有所阐述。如有任何具体疑虑,欢迎加入讨论并尽可能提供详细信息!