在monorepo中实施共享依赖关系

时间:2019-03-01 00:56:09

标签: npm yarnpkg lerna monorepo yarn-workspaces

我们有一个使用lernayarn workspaces的monorepo。多个团队为此提供了软件包,我们有一些共同的依赖关系,我们在这些依赖关系下会迫使人们使用相同的版本。

有哪些选项可以强制所有软件包使用相同版本的特定依赖项?有没有无需编写自定义脚本就可以实现的方法?

我想避免这种情况:

my-repo/
  packages/
    pkg-A/
      package.json
        "address-validator": 1.1.0
    pkg-B/
      package.json
        "address-validator": 1.2.0

我知道您可以使用lerna addlerna run来统一添加/升级​​,但是如何防止个人在不知不觉中使他们的包裹变得独一无二?

1 个答案:

答案 0 :(得分:0)

我刚刚在facebook的create-react-app中注意到了一个解决此问题的好方法。它们在react-dev-utils包中导入(全部?)外部依赖关系,并从那里导出。然后,所有其他软件包(例如react-scripts)都从react-dev-utils导入依赖项。

这很好,因为您只需要担心使用一个软件包的最新版本(例如react-dev-utils)来使用要控制的所有事物的最新版本。而且,它很灵活,因为您可以通过直接导入其他版本来覆盖其中一个依赖项。

因此它看起来像:

my-repo/
  packages/
    my-deps/
      pkg1.js // <--- module.exports = require("pkg1");
      package.json
        "pkg1": 1.2.0
    foo/
      index.js // <--- const pkg1 = require("my-deps/pkg1")
      package.json
        "my-deps": 1.1.0