什么是JavaScript Monorepo的正确方法

时间:2019-09-17 17:47:37

标签: javascript npm webpack lerna monorepo

我正在尝试找出针对JavaScript monorepo的正确方法。想象一下包含软件包/库的monorepo:

root
  - node_modules
  - packages
      + lib-a
          * node_modules
      + lib-b
          * node_modules

现在假设lib-alib-b软件包都使用webpack作为其构建工具。

我看到两种方法

  1. 添加wepback作为对root的依赖。在两个软件包中都包含“ build”脚本:"build": "webpack -p --config webpack.config.jswebpack.config.js可以包含根webpack.config.js。然后,我可以使用诸如lerna之类的工具从根目录运行构建(这意味着webpack二进制文件可以被识别。但是由于webpack不存在,因此我将无法在特定程序包中运行构建。我可能可以将构建脚本更改为类似"build": "../../node_modules/.bin/webpack -p --config webpack.config.js

  2. 每个软件包中始终包含webpack。这意味着build脚本将成功。这也意味着每个程序包都具有相同的依赖关系,我可能应该注意每个程序包都使用相同的webpack版本。

基本上,我要讲的是monorepo内的软件包应该如何结构化?如果发布了任何软件包,是否总是有可能单独build单独软件包。

2 个答案:

答案 0 :(得分:2)

您的方法2是正确的。由于每个包装都是独立的独立包装,因此您需要分别处理。

monorepo的优势不在于通过目录结构共享文件,而在于:

  1. 将所有依赖项引导到具有平坦结构的单个node_modules上,从而有效地对它们进行重复数据删除。
  2. 通过常规软件包import / require()使软件包对其他软件包可用,因为它们是外部依赖项。而且,借助与node_modules的符号链接,您的“依赖”包始终包含最新内容,而无需发布。
  3. 在所有软件包中实施一致的,始终最新的依赖关系结构。如您所说:“这也意味着每个程序包都将具有相同的依赖性”。
  4. 自动化工具,只需一个命令即可对所有软件包执行不同的维护任务(例如,构建,发布)。

我知道一开始并不容易,但是当您深入研究Lerna文档时,它变得更加清晰。除了Lerna main page外,我还建议您阅读hoistingFAQ以及bootstrappublish之类的单个命令。

答案 1 :(得分:0)

我们当前的配置与您相同:

root
  - node_modules
  - packages
      + lib-a
          * node_modules
      + lib-b
          * node_modules

我们使用 lerna 处理我们的项目:https://github.com/lerna/lerna

您只需要在lerna.json

中指定您的软件包文件夹
{
  "lerna": "3.16.4",
  "packages": ["packages/*"],
  "version": "0.0.0",
  "npmClient": "yarn",
  "useWorkspaces": true
}

然后在您的package.json脚本中,您可以使用以下行:

"build": "lerna run build",

这基本上将在所有软件包中运行构建。因此,只要每个软件包中的构建脚本都具有正确的参数并安装了webpack,它将自动运行webpack构建。

在那之后,您可以简单地处理指定软件包中的工作。