如何在 monorepo 中成功锁定节点模块依赖项?

Posted

技术标签:

【中文标题】如何在 monorepo 中成功锁定节点模块依赖项?【英文标题】:How can I successfully lock down node module dependencies in a monorepo? 【发布时间】:2018-03-11 13:57:33 【问题描述】:

我正在开发一个开源项目,该项目目前使用lerna 来帮助管理具有多个包的单个存储库。到目前为止,一切都很好,只是偶尔会出现一些问题,因为我们目前没有收缩包装任何东西。我一直在尝试做一些单仓库版本的收缩包装,这样我们就不会受到所有依赖项的摆布(令人惊讶的是,在发布过程中,每件事都经常出错!),但遇到了一些障碍,并且想知道我是否走在正确的轨道上。

我最初希望使用我在以前的项目中熟悉的 npm shrinkwrap。不幸的是lerna doesn't appear to support shrinkwrap。

B 计划是使用 yarn,在经历了一些最初的困难之后,在切换到使用 yarn 工作区后似乎一切正常——至少我认为 yarn install --frozen-lockfile 正在做我想做的事。

不幸的是,除了依赖锁定之外,yarn 似乎没有帮助 - 一切都与 npm 和 lerna 一起工作,但 lerna 和yarn 工作区似乎导致解决模块问题(甚至解决同一目录中令人费解的问题) .

也许切换到 yarn 是多余的,所以我开始想知道更新版本的 npm 和 package-lock.json 是否会是一个更好的主意。不幸的是,这看起来像would need some work arounds with lerna,此时我开始怀疑 lerna 到底添加了多少。也许dropping lerna 会有所帮助?

那么,tl;dr,有没有人有一种在 monorepo 中锁定模块依赖关系的好方法?

【问题讨论】:

【参考方案1】:

yarn 是一个生产就绪的包管理器,原生支持 monorepos :)

使用yarn workspaces时,无需同时使用lerna作为monorepo管理器。

如果需要,您可以使用 lerna 的其他功能,但没有理由使用 lerna 来安装 monorepos(已经使用了 yarn)。

如果在使用yarn 安装/管理 monorepo 时出现特定错误,请将其添加到问题中。

注意事项:

--frozen-lockfile 在纱线 monorepo 中没有做任何事情。 yarn 有一个我认为不会很快解决的未决问题。

【讨论】:

我猜自 2017 年以来 yarn 发生了一些变化,但 --frozen-lockfile 的问题听起来并不令人放心。到目前为止,Rush 似乎可以正常使用这个 monorepo -> github.com/hyperledger/fabric-chaincode-node【参考方案2】:

我建议只使用精确的版本控制;所以在你的package.json 文件中,其中有^3.4.2 等依赖项的版本号,将其更改为3.4.2。数字前的^(或~)表示版本范围。您可以使用save exact config option:--save-exact 标志或将save-exact=true 放在回购中的.npmrc 文件中来实现这一点。 lerna add 也支持exact option。

希望有帮助!

【讨论】:

这确实是我们使用的解决方法,不幸的是它只是稍微好一点,因为您的所有依赖项都不太可能指定其依赖项的确切版本。我最接近答案的是 Rush - rushjs.io - 不幸的是,我最终从事其他工作,所以我无法迁移旧项目以确认它确实有效。不过它看起来很有希望,我很想在未来的任何单声道回购中尝试一下。

以上是关于如何在 monorepo 中成功锁定节点模块依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

Monorepo 中的对等依赖关系

部署在 NX monorepo 中创建的 nestjs 服务器

如何列出 React 项目中未使用的节点模块/依赖项?

如何通过 NPM 管理非节点模块作为 Node Project 的依赖项?

如何在不发布的情况下在 lerna monorepo 中构建 docker 镜像

在 monorepo 中的多个应用程序之间共享组件时如何处理共享依赖项