【问题标题】:What is a correct approach to a javascript monorepo什么是 javascript monorepo 的正确方法
【发布时间】:2019-09-17 17:47:37
【问题描述】:

我正在尝试为 javascript monorepo 找出正确的方法。想象一下包含包/库的 monorepo:

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

现在假设lib-alib-b 包都使用webpack 作为它们的构建工具。

我看到了两种方法

  1. 添加wepback 作为对根目录的依赖。在两个包中包含“构建”脚本:"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 该包。

【问题讨论】:

  • 我们的 mono repo 的工作方式是每个包都有自己的节点模块,但您只能安装您感兴趣并且正在开发的那些。然后我们在根目录下有一个命令 Build,它基本上在所有包中执行构建
  • 因此您将构建的责任放在“根”包上并从那里运行构建命令。这似乎是正确的方法。我正在考虑对其余命令也这样做(例如测试、清理等)。
  • 你应该看看 lerna。它具有帮助您管理 monorepo 并自动执行某些任务的工具,例如链接 monorepo 中的包。我将 lerna 用于我的 monorepo,效果很好。
  • 我认为将这个问题的标题更改为“什么是 javascript monorepo 的正确方法”是有意义的。这将有助于其他人在通过 Stackoverflow/Google 搜索时找到此问题/答案。

标签: javascript npm webpack lerna monorepo


【解决方案1】:

您的方法 #2 是正确的。您单独处理每个包裹,因为它是一个独立的、独立的包裹。

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

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

我知道一开始并不那么容易,但是当您深入研究 Lerna 文档时,它会变得更加清晰。除了 Lerna main page,我还推荐阅读 hoistingFAQ 以及 bootstrappublish 等个别命令。

【讨论】:

  • 我支持这里的一切。每个包都应该能够自行构建和测试。我推荐 yarn workspaces + lerna,但这不是必须的。我们创建了根级别的 tsconfig 和 jest 配置,它们由各个包导入/扩展。我们还让 root 负责对所有包进行 linting,husky 用于预提交挂钩,commitizen 用于一致的提交消息。
【解决方案2】:

我们现在的配置和你一样:

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 构建。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-01
    • 2023-03-15
    • 2010-12-04
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多