复活了! Lerna V6 带来了哪些新东西?
曾几何时, Lerna
是最流行的 JS monorepo
工具之一,或许大家有所耳闻,在去年 Lerna
的核心作者提到了 Learn
已经基本不再维护,一度引起了前端社区的广泛讨论。
但是相信很多小伙伴还不知道,今年5月份,Nrwl
宣布接管了 Lerna
, Nrwl
是 Nx
背后的公司。
https://github.com/nrwl/nx
由两位前 Google
员工和 Angular
核心团队成员 Jeff Cross
和 Victor Savkin
创立,他们也是在 monorepo
领域深耕多年的高手了,对此 Lerna
的核心作者也在 Github
上进行了官宣:
自今年 5 月接手以来,Nrwl
推出了一个全新的网站,更新了文档的内容,并让 Lerna
的速度提高了 10 倍!
现在,Lerna v6 正式发布了!我们一起来看看有哪些新东西。
默认缓存
在 Lerna v4
之前, Lerna
一直在使用 p-map
或 p-queue
进行任务调度。在 v5.1
中, Lerna
引入了 nx
作为额外的机制来调度任务。
Nx
内置了缓存,这也为 Lerna
提供了缓存支持,使其速度极快。最近的基准测试结果显示,Lerna
比 Lage
快了 2.5
倍,比 Turbo
快 4
倍左右(截至2022年10月)。
在之前,你必须通过在 lerna.json
中设置 useNx
标志来启用“Nx支持”:
// lerna.json
{
...
"useNx": true
}
在经过了大量测试和反馈的 v6
中,所有 Lerna
工作区都默认设置为 useNx
。如果你不想使用它,可以通过将标志设置为 false
来禁用它。
要体验快速缓存,请确保在 Lerna
工作区的根目录中有一个 nx.json
文件,在那里你可以定义可缓存的操作。查看文档了解更多细节(https://lerna.js.org/docs/features/cache-tasks)。
下面是一个配置文件示例:
{
"tasksRunnerOptions": {
"default": {
"runner": "nx/tasks-runners/default",
"options": {
"cacheableOperations": ["build", "test"]
}
}
}
}
你也可以运行下面的命令:
npx lerna add-caching
根据你现有的 Lerna
工作区自动生成 nx.json
配置文件。
远程缓存
通过使用 Nx
作为 Lerna
的任务调度器,它继承了 Nx
附带的所有功能。不仅包括本地缓存,还包括远程缓存和分布式任务执行的能力。
远程缓存允许你将本地缓存分发给你的同事和CI系统。它通过 Nx Cloud
完成的,但分布式缓存只是一个方面。Nx Cloud
还提供了一个“运行视图”,可以可视化你的 CI
运行,具有简单的分组和过滤功能,它具有跨多台机器动态分配任务的能力。所有这些都是通过优化最佳的并行化和机器利用率实现的。
你需要进行的所有设置就只是运行...
npx nx connect-to-nx-cloud
它将引导你完成几个问题并为你设置 Nx Cloud
。
相关文档:https://lerna.js.org/docs/features/cache-tasks#distributed-computation-caching
任务管道
在 monorepo
环境中运行任务时,你可能会希望最大化、并行化,但仍然要考虑到任务之间的潜在依赖关系。例如,假设你有一个依赖于某些公共组件库的 Remix
应用程序。你需要确保在构建或服务 Remix
应用程序之前完成了公共组件库的构建。
使用 Lerna v6
,你可以在 nx.json
文件中定义 targetDefaults
:
// nx.json
{
...
"targetDefaults": {
"build": {
"dependsOn": ["^build"]
},
"dev": {
"dependsOn": ["^build"]
}
}
}
在这种情况下,无论何时运行 build
或 dev
,Lerna
都会首先在所有依赖包上运行构建任务。
相关文档:https://lerna.js.org/docs/concepts/task-pipeline-configuration
添加缓存命令
Learn
提供了一个专门的命令来简化设置缓存以及添加任务管道的操作:
npx lerna add-caching
这将扫描你的工作区,找到所有 package.json
脚本,然后指导你完成可缓存的操作以及任务管道的配置。
PNPM 支持
Lerna
在 V6 版本增强了对 PNPM
的支持。如果你将 Lerna
与 PNPM
结合使用,Lerna
会基于 workspace.yaml
来进行包检测。为了强制执行 useworkspace: true
,Lerna
会自动更新 pnpm-lock.yaml
。当使用 lerna version
时,Lerna
还添加了对 PNPM workspace:
协议的适当支持。
现在,你终于可以使用一个最快的包管理器,并结合最新的快速 Lerna
一起使用了 ...
相关文档:https://lerna.js.org/docs/recipes/using-pnpm-with-lerna
动态终端输出
当在大量项目中并行运行任务的时候,在终端中跟踪构建的内容和任务失败的位置可能会非常困难。这就是为什么新的 Lerna
版本带有动态的终端输出,只显示在给定时刻最相关的内容。
VSCode 扩展
Lerna
提供了一个专用的 VSCode
扩展来帮助我们浏览 monorepo
项目。这允许我们可以直接从上下文菜单运行命令(通过右键单击项目):
或者可视化一个项目及其与工作区中其他项目的关系。
你还将在配置文件中获得智能自动补全的功能。下面是一个 Nx
控制台示例,它在编辑 nx.json
任务依赖项时提供基于上下文的信息。
lerna repair
Lerna v6
带有一个内置的 lerna repair
命令。这个命令可以自动修复你的 Lerna
配置。例如,在 Lerna v6
中,没有必要在你的 lerna.json
中添加 useNx: true
,因为这是新的默认值。运行 lerna repair
可以解决类似的问题。
这个命令可以让你始终拥有最新的 Lerna
设置,并且随着 Learn
将来不断添加迁移,它将变得更加强大。
迁移到 Lerna v6
从 Lerna v5
迁移到 v6
并没有 break change
。Learn
增加了 major
,因为它改变了一些默认值。类似地,如果你仍然在 v4
上,并且想要迁移到 v6
上,应该也非常简单,在大多数情况下不会出错。
只需将 Lerna
包版本更新到最新,然后运行:
npx lerna add-caching
最后
- https://blog.nrwl.io/lerna-reborn-whats-new-in-v6-10aec6e9091c
- Lerna Github:https://github.com/lerna/lerna
如果你有任何想法,欢迎在留言区和我留言,如果这篇文章帮助到了你,欢迎点赞和关注。
对此你有什么看法?复活后的 Learn 还是你的菜吗?欢迎在留言区讨论!
点赞
和在看
是最大的支持⬇️❤️⬇️