NPM7.0.0的工作区还需要Lerna吗?

q5iwbnjs  于 2023-01-21  发布在  其他
关注(0)|答案(3)|浏览(212)

NPM 7.0.0工作区是否还需要Lerna?
我真的没有这个新的npm功能的经验。
Npm/rfcs对此写道:
首先,也是最重要的是,有一种选择是把问题留给用户来解决,已经有一个非常受欢迎的项目Lerna提供了其中的一些功能。
还有一种选择是只支持这个提议的安装(或Lerna命名的引导)方面,遵循一种功能不太丰富的方法,但仍然能够实现改善管理多个子包的用户体验的基本目标,但从本RFC研究阶段收集的所有反馈来看,这种选择对相关的维护者社区来说是不太理想的。
很高兴每一个答案和解释:)

but5z9lq

but5z9lq1#

NPM 7已经出来了,它支持工作空间。他们还将在即将发布的版本中继续开发这个领域,
也就是说,lerna拥有比npm7yarn工作区更多的高级特性,而且,yarn声明他们永远不会试图取代lerna这样的工具,相反,他们打算实现处理工作区的核心逻辑,如安装子包依赖项和包符号链接。
一个很好的例子是命令:lerna changed,它为您提供了自上一个标记版本以来已更改的软件包列表,这可能对CI/CD非常有帮助。欢迎您探索lerna提供的额外命令。
到目前为止,npm7支持的与工作空间相关的唯一命令实际上是npm i/npm ci,这不是新命令,但它确实处理了嵌套的包和符号链接。
我写了一篇文章,如果你想在move to a monorepo上运行npm 7的话,它会更深入地分析配置,所以不使用lerna绝对是一个选择,与lerna相比,你可能需要在CI/CD方面做更多的工作,并添加一些会影响嵌套包的开发脚本。

wi3ka0sx

wi3ka0sx2#

答案是肯定的,你仍然需要Lerna或其他工具来补充npm@7工作区的特性。这些是npm@7工作区不能处理的事情(在写这个答案时):

了解monorepo拓扑

npm工作区在一定程度上了解monorepo包的拓扑结构,例如,工作区知道package-c使用package-a和package-b作为它的依赖项,但有一点需要记住:

$ npm run build --workspaces

此命令将对所有monorepo包运行npm run build
假设package-a依赖于package-b,package-c同时依赖于package-a和package-b,那么命令的执行顺序取决于package.json中的workspaces数组。

{
  "workspaces": ["package-a", "package-b", "package-c"]
}

则构建顺序为:

  • Package -a
  • Package -b
  • Package -c

但正确的顺序应该是:

  • Package -b
  • Package -a
  • Package -c

为了按照正确的顺序构建,您应该确保在package.json中按照正确的顺序列出它们:

{
  "workspaces": ["package-b", "package-a", "package-c"]
}

变革管理

Lerna可以检测monorepo中的变化,并为您提供一个已更改的软件包列表。如果您只想对已更改的软件包进行测试,这将非常方便。npm@7工作空间还没有这样的功能(2021年10月5日)。

出版业

Lerna可以管理软件包的版本控制和发布,它有两种不同的版本管理策略:固定的和独立的。它生成修改日志,并且只发布修改过的包到npm。
当然还有更多的东西,但这些都是你在npm@7工作区上仍然需要的主要东西。如果你使用Lerna或其他工具,那就取决于你了。
我已经在一篇文章中记录了所有的things I have learned while maintaining JavaScript monorepo with Lerna,它描述了在引入npm@7之后,monorepo管理过程是如何显著简化的,但是为什么我们仍然需要使用Lerna或其他工具。

r1zk6ea1

r1zk6ea13#

从管理的Angular 来看是的,因为它可以处理变更报告之类的事情。
然而,如果你只是想拥有一个monorepos,并且你知道依赖构建的顺序而不是依赖packages/*,那么就没有必要这样做。在大多数情况下,你可以简单地使用下面的序列来进行构建,并且在你真正需要它之前,不要使用lerna和依赖。

yarn install --frozen-lockfile
yarn workspaces run prepare
yarn workspaces run test

相关问题