跳到主要内容

遗留包管理

在 lerna v7.0.0 中,我们默认移除了 lerna bootstraplerna addlerna link 命令。

本节介绍如何最好地迁移并使用包管理器的 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)。

我用什么替换它?

npm install(或 yarn/pnpm)替换 lerna bootstrap。如果您已经在之前调用 lerna bootstrap 的工作流中执行包管理器的安装命令,那么您可以直接删除它。lerna link 可以直接删除,因为链接步骤现在由您的包管理器在 npm install 期间处理。

信息

如果您使用 yarn 并依赖于链接二进制文件,那么在切换到工作空间后,您可能需要删除一次 node_modules 文件夹。详情请参见这个 yarn 问题

替换您使用的 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>

自定义提升

Lerna 遗留的 bootstrap 命令的一个优点是它提供了对提升或不提升某些依赖到仓库根目录,或将它们保留在嵌套位置的控制。

因此,如果您有相当复杂的包提升设置,您可能会担心迁移away from lerna bootstrap

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

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

我们尚未遇到一个无法转换为现代 yarn 的、由 lerna bootstrap 驱动的仓库,无论其提升复杂性如何,所以如果这适用于您,请尝试使用。

如果您只是在没有任何高级提升考虑的情况下使用 lerna bootstrap,可以随意选择任何包管理器,它们都提供强大的 workspaces 实现。

临时填充遗留包管理命令

如果您真的遇到困难,并且在 v7 中需要遗留的包管理命令 lerna bootstraplerna addlerna link,您可以安装与您的 lerna 包版本相同的 @lerna/legacy-package-management 包,这将使用旧的实现填充这些命令。

需要注意的是,这只是一个权宜之计,这个新包可以被视为仅处于维护模式 - 不会考虑遗留包管理问题(如 lerna bootstraplerna addlerna link)的新功能,我们只会合并关键补丁和安全更新。

如果您处于这种情况,请在 lerna 仓库上开一个 issue,以便我们了解您面临的困难并帮助您找到前进的道路:

https://github.com/lerna/lerna/issues/new/choose

背景

Lerna 是 JavaScript 生态系统中最早的 monorepo/workspace 工具。当它在 2015/2016 年创建时,生态系统看起来完全不同,没有内置功能来处理在单个仓库中使用多个包("工作空间")。像 lerna bootstraplerna addlerna link 这样的命令都是 lerna 项目的关键部分,因为当时没有其他选择。

然而,事实是,多年来,我们熟悉和喜爱的包管理器(npmyarnpnpm)都完全支持工作空间作为一级用例。

它们有经过实战检验的实现,涵盖了以自然方式添加、删除和链接本地包,并将它们与第三方依赖相结合。

这就是为什么在作为 lerna 的首席维护者任职的最后几年里,Daniel 一直鼓励大家强烈重新考虑使用 lerna 中的遗留包管理命令,而是利用他们选择的包管理器来做它最擅长的事情。

我们远远知道这一背景,但作为 2022 年项目的新管理者,我们不想在没有充分熟悉现实的情况下就直接开始删除功能。现在我们已经积极维护了一段时间,我们完全同意 Daniel 和其他人的观点,即 lerna 中的遗留包管理命令需要被淘汰。

通过移除这些有更好的原生替代方案的遗留部分,我们和 lerna 社区的其他成员现在可以专注于 lerna 独特的有价值的事情(但不限于版本控制和发布),并使它们尽可能优秀!

信息

这同样的背景在 Lerna v7 讨论中有所涉及,如果您有任何具体的担忧,请加入我们并提供尽可能多的信息!