Lerna 重生 - v6 版本有哪些新内容?
Lerna v6 版本发布啦!!以下是关于全新 Lerna 体验你需要知道的一切!
目录
- 勒纳仍在不断进化
- 默认启用缓存的快速 Lerna
- 使用 Lerna 进行远程缓存
- 定义任务管道
- Lerna 添加缓存命令
- PNPM 对 Lerna 的支持
- 动态终端输出
- 适用于 Lerna 工作区的 VSCode 扩展
- 勒纳维修
- 勒纳和普雷蒂尔
- 迁移到 Lerna v6
- Lerna现在使用Nx了。我还能继续使用我的Lerna命令吗?
- 您是否使用 Lerna 维护开源软件仓库?
勒纳仍在不断进化
如果您已经知道这一点,请随意跳过。但令人惊讶的是,许多人仍然不知道Lerna 已经回归,它不仅没有过时或被弃用,而且还获得了全新的功能。我们Nrwl团队是 Nx 的创建者,鉴于我们在单体仓库领域拥有丰富的经验,当Lerna 在 2022 年 4 月被宣布“停止维护”时,我们主动提出接管它的维护工作。
自 2022 年 5 月我们接手以来,一切都像坐过山车一样。我们推出了全新的网站,更新了文档内容,并将Lerna 的速度提升了 10 倍。现在,Lerna v6 正式发布!
默认启用缓存的快速 Lerna
在 Lerna v4 之前,任务调度一直使用 npm 包来实现。在p-mapv5.1版本中,我们引入了另一种任务调度机制。它的优势在于:Nx 内置了缓存功能,这也为 Lerna 提供了缓存支持,使其速度飞快。最近的基准测试表明,Lerna 的速度比 Lage 快 2.5 倍,比 Turbo 快约 4 倍(截至 2022 年 10 月;您可以自行测试)。p-queuenx
到目前为止,您需要通过设置以下useNx标志来启用“Nx 支持” lerna.json:
// lerna.json
{
...
"useNx": true
}
过去几个月我们一直在测试这项可选功能,并收到了来自企业和开源项目的大量宝贵反馈。因此,在 v6 版本中,所有 Lerna 工作区默认都会启用 useNx,true即使您的 Lerna 配置文件中没有设置。如果您不想使用此功能,可以通过将该标志设置为 false 来禁用它。
nx.json要体验快速缓存,请确保在 Lerna 工作区的根目录下有一个文件,用于定义可缓存的操作。更多详情请参阅文档。以下是一个配置文件示例:
{
"tasksRunnerOptions": {
"default": {
"runner": "nx/tasks-runners/default",
"options": {
"cacheableOperations": ["build", "test"]
}
}
}
}
请注意,您还可以运行……
npx lerna add-caching
nx.json..根据您现有的 Lerna 工作区自动生成配置文件。
使用 Lerna 进行远程缓存
通过使用 Nx 作为 Lerna 的任务调度器,它继承了 Nx 的所有功能。这不仅包括本地缓存,还包括远程缓存和分布式任务执行的可能性。
远程缓存允许您将本地缓存分发给同事和持续集成 (CI) 系统。这是通过Nx Cloud实现的。但分布式缓存只是 Nx Cloud 的一个方面。Nx Cloud 还提供“运行视图”,可以直观地展示您的 CI 运行情况,并提供便捷的分组和筛选功能。更重要的是,它能够将任务动态地分配到多台机器上,并通过优化实现最佳并行化和机器利用率。
你只需要运行一下就可以了……
npx nx connect-to-nx-cloud
在您的 Lerna 工作区中,它将引导您回答几个问题,并为您设置Nx Cloud。
请参阅文档了解更多信息。
定义任务管道
在单体仓库环境中运行任务时,您希望尽可能提高并行化程度,但同时也要考虑任务间的潜在依赖关系。例如,假设您有一个 Remix 应用,它依赖于某个shared-ui库。您希望确保shared-ui在构建或运行 Remix 应用之前,该库已经构建完成。
nx.json使用 Lerna v6,您可以通过在文件中定义以下代码来实现targetDefaults:
// nx.json
{
...
"targetDefaults": {
"build": {
"dependsOn": ["^build"]
},
"dev": {
"dependsOn": ["^build"]
}
}
}
在这种情况下,无论何时运行 `lerna`build或dev`lerna`,Lerna 都会首先build对所有依赖包运行该任务。
Lerna 添加缓存命令
如果您尚未设置缓存或任务管道,请不要担心。我们提供了一个专门的命令,旨在尽可能简化操作:
npx lerna add-caching
这将扫描您的工作区,找到所有 package.json 脚本,然后指导您完成缓存操作和任务管道的配置。
这里有一个快速演示视频:
您当然始终可以手动创建 nx.json 文件。
PNPM 对 Lerna 的支持
过去,Lerna 对 PNPM 的支持并不完善。我们在 v6 版本中修复了这个问题。现在,当您将 Lerna 与 PNPM 结合使用时,我们会确保根据 PNPM 的协议检测软件包pnpm-workspace.yaml,并相应地useWorkspaces: true更新 PNPM 的协议。pnpm-lock.yaml
此外,我们还添加了对PNPM 所用协议lerna version的正确支持。workspace:
现在,您终于可以将速度最快的包管理器之一与全新的 Lerna 快速体验结合使用。此外,请务必查看我们的文档了解所有详细信息。
动态终端输出
当在大量项目中并行运行任务时,很难在终端中跟踪哪些部分已构建完成,哪些任务失败。因此,新版 Lerna 配备了动态终端输出,仅显示当前最相关的信息。
请注意,您仍然可以像往常一样在 CI 上看到所有输出。
适用于 Lerna 工作区的 VSCode 扩展
Lerna 现在拥有一个专门的 VSCode 扩展,可以帮助您浏览您的 monorepo。这使您可以直接从上下文菜单(右键单击项目)运行命令:
或者在工作区中可视化一个项目及其与其他项目的关系。
您还可以在配置文件中获得智能自动补全功能。以下示例展示了在编辑nx.json任务依赖项时,Nx 控制台如何提供基于上下文的信息。
勒纳维修
Lerna v6 内置了一个lerna repair命令。运行此命令会自动修复您的 Lerna 配置。例如,在 Lerna v6 中,您无需再useNx: true在配置文件中添加lerna.json`<your_name>`,因为这将是新的默认配置。运行lerna repair此命令即可修复此问题。
这样一来,您就可以始终拥有最新的 Lerna 设置,而且随着我们未来不断添加迁移功能,它的功能将会变得更加强大。
勒纳和普雷蒂尔
如今,Prettier 已成为每位开发者的标准工具链的一部分。在 Lerna v6 中,我们新增了一项功能,用于检测工作区中是否已安装 Prettier。如果已安装,我们会自动将其应用到所有通过运行 `lerna version` 命令更新的文件。从此无需再为了修复文件格式而提交后续代码!
迁移到 Lerna v6
从 Lerna v5 迁移到 v6 不会造成任何功能破坏。我们提高了主版本号,是因为我们更改了一些默认设置,为了谨慎起见,也为了更好地与用户沟通,我们增加了主版本号。
同样地,如果您仍在使用 v4 版本,并且想要迁移到 v6 版本,这应该相当简单,并且在大多数情况下不会出现问题。
只需将 Lerna 软件包版本更新到最新版本,然后运行即可。
npx lerna add-caching
启用和配置工作区的缓存。
遇到问题或需要帮助吗?我们还有一个由社区成员组织的 Slack 频道,Nx 和 Lerna 的核心成员也会在那里交流。加入https://go.nrwl.io/join-slack并进入#lerna频道即可。
Lerna现在使用Nx了。我还能继续使用我的Lerna命令吗?
当然!Lerna 与 Nx 集成的一大优势在于,您可以继续使用现有的 Lerna 命令,而无需将其迁移到新的语法。它们现在运行速度会快得多。
您可以在我们的文档中了解更多相关信息。
您是否使用 Lerna 维护开源软件仓库?
如果您是开源软件维护者,并且正在使用 Lerna 工作区,请告诉我们!您可以在 Twitter 上
联系 Lerna 团队,或者直接联系我。我们很乐意查看并协助您进行迁移,我们会检查您的代码仓库,确保其在单体仓库设置和缓存等功能方面都已配置到最佳状态。
也就是说,作为开源维护者,您还可以获得 Nx Cloud 提供的无限免费计算缓存。我们很乐意为您设置这项服务。
了解更多
- 🧠 Lerna Docs
- 👩💻 Lerna GitHub
- 💬 Nrwl 社区 Slack(加入
#lerna频道) - 📹 Nrwl YouTube频道
- 🧐需要 Angular、React、Monorepos、Lerna 或 Nx 方面的帮助吗?欢迎联系我们 😃
另外,如果你喜欢这篇文章,请点击❤️,并务必在Twitter上关注Juri和Lerna,获取更多内容!





