NPM 7.0.0 的工作区是否不再需要 Lerna?

Mar*_*der 20 package node.js npm lerna

NPM 7.0.0 工作区是否不再需要 Lerna?

我对这个新的 npm 功能并没有真正的经验。

Npm/rfcs写道:

首先也是最重要的是,可以选择将问题集留给用户空间来解决,已经有非常流行的项目 Lerna 提供了其中的一些功能。

还可以选择仅支持此提案的安装(或 Lerna 命名的引导程序)方面,采用功能不太丰富的方法,但仍然可以实现改善管理多个子包的用户体验的基本目标,但是从在这个 RFC 的研究阶段收集的所有反馈来看,这个替代方案对于所涉及的维护者社区来说不太理想。

很高兴每一个答案和解释:)

jon*_*y89 25

NPM 7 已经发布,它支持工作区。他们还将在即将发布的版本中继续开发此域,

话虽如此,lerna它具有比npm7yarn工作区更多的高级功能,此外,还yarn 声明他们永远不会尝试替换诸如 之类的工具lerna,而是打算实现处理工作区的核心逻辑,例如安装子包依赖项和包符号链接。我希望npm做同样的事情。

一个很好的例子是命令:lerna changed它为您提供自上次标记版本以来已更改的包列表,这对 CI/CD 非常有帮助。欢迎您探索lerna提供的额外命令。

迄今为止,npm7与工作区相关的唯一命令实际上是npm i/npm ci这不是新命令,但它确实处理了嵌套包和符号链接。

我写了一篇文章,详细介绍了配置,以防您想使用 npm7迁移到monorepo,因此在没有 lerna 的情况下工作绝对是一种选择,与 lerna 相比,您可能需要在 CI/CD 方面做更多的工作并自行添加一些会影响嵌套包的开发脚本。此外,IMO lerna 更适合开发库而不是应用程序。

  • 从 npm 7.7 开始,现在支持“npm run”和“npm exec”,并且可用于跨多个工作区/包运行命令。 (2认同)

小智 16

答案是肯定的,您仍然需要 Lerna 或其他工具来补充 npm@7 工作区附带的功能。这些是 npm@7 工作区不处理的事情(截至撰写本答案时):

\n

了解 monorepo 拓扑

\n

npm 工作区在一定程度上了解 monorepo 包拓扑。例如,工作空间知道 package-c 使用 package-a 和 package-b 作为其依赖项。但有一件小事需要记住:

\n
$ npm run build --workspaces\n
Run Code Online (Sandbox Code Playgroud)\n

该命令将运行npm run build此命令将为所有 monorepo 包

\n

让\xe2\x80\x99s 说package-a 依赖于package-b,而package-c 又依赖于package-a 和package-b。运行命令的执行顺序取决于您的workspaces数组package.json。所以如果你有这个:

\n
$ npm run build --workspaces\n
Run Code Online (Sandbox Code Playgroud)\n

那么构建顺序将是:

\n
    \n
  • 包a
  • \n
  • 包-b
  • \n
  • 包-c
  • \n
\n

但正确的顺序应该是:

\n
    \n
  • 包-b
  • \n
  • 包a
  • \n
  • 包-c
  • \n
\n

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

\n
{\n  "workspaces": ["package-a", "package-b", "package-c"]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

更换管理层

\n

Lerna 可以检测 monorepo 中的更改,并为您提供已更改的包的列表。如果您只想对更改的包运行测试,这会很方便。npm@7 工作区还不能做这样的事情(2021 年 10 月 5 日)。

\n

出版

\n

Lerna 可以管理包的版本控制和发布。具有两种不同的版本管理策略:固定版本和独立版本。它生成变更日志,并仅将更改的包发布到 npm。

\n

当然还有更多内容,但这些是您在 npm@7 工作区之上仍然需要的主要内容。如果您使用 Lerna 或其他工具,那由您决定。

\n

我已经记录了我在使用 Lerna 维护 JavaScript monorepo 时学到的所有东西我在一篇文章中它描述了 npm@7 引入后 monorepo 管理流程如何显着简化,但为什么我们仍然需要在其之上使用 Lerna 或其他工具。

\n

  • 另外,“conventionalCommits”已预先连接到“lerna”中,它可以完全自动化更改日志生成。另外,为了更精细的控制,您可以仅进行版本控制并使用调用“npmpublish||”的简单脚本进行发布。:` (如果没有什么可发布的,则不会以零代码退出;并且 npm 不会让你发布未修改的 package.json)。 (3认同)
  • 我想为这个伟大的答案添加额外的信息,NPM 有一个开放的 RFC [按良好顺序执行工作区命令](https://github.com/npm/rfcs/issues/442),希望它能够登陆未来。在版本/发布方面,我创建了一个源自 Lerna 的库,其中我只提取了 2 个命令(版本和发布),因为我想保留常规变更日志,但我不想要 Lerna 的所有额外内容,你可以看一下 [ws-conventional-version-roller](https://github.com/ghiscoding/ws-conventional-version-roller),lib 本身是特意创建为 NPM Workspace (2认同)