如何使用“rules_js”为具有多个包的 monorepo 设置 bazel 工作区?

Tox*_*ris 3 bazel pnpm-workspace bazel-rules-js

我想设置bazel构建系统,以使用新的rules_js规则集构建包含多个 JavaScript 包的 monorepo 。rules_js的文档说它通过“工作空间”支持“monorepo 中的嵌套 npm 包”,但我不明白如何将所有内容连接起来,以便:

  • monorepo 中的每个包可以有不同的外部依赖项
  • monorepo 中的包也可以相互依赖

我尝试@npm//$DEPENDENCYdepsof 规则中使用类似js_library引用我的 npm 依赖项(如旧的rules_nodejs规则集),但我只是收到有关不存在目标的错误。

Tox*_*ris 10

长话短说

设置 pnpm 工作区并多次使用以在 bin 树中npm_link_all_packages设置单独的文件夹。node_modules然后node_modules:node_modules/$DEPENDENCY您的deps.

rules_js如何创建node_modules文件夹?

rules_js使用规则基于锁定文件npm_link_all_packages设置文件夹。这与pnpm包管理器的命令类似。区别在于在源树中创建文件夹和在 bin 树中创建文件夹。node_modulespnpm-lock.yamlpnpm installpnpm installnode_modulesnpm_link_all_packages

由于您希望每个包都可以有不同的外部依赖项,因此它们每个都需要有自己的node_modules. 如果您设置了pnpm 工作区, pnpm支持多个包的单个锁定文件。生成的锁定文件可用于设置包含多个包的 Bazel 工作区,每个包在 bin 树中都有自己的文件夹。该规则将根据Bazel 包名称和.rules_jsnode_modulesnpm_link_all_packagesnode_modulespnpm-lock.yaml

因此,您必须设置一个 pnpm 工作区并多次使用来在 bin 树中npm_link_all_packages设置单独的文件夹。node_modules

我到底该如何设置呢?

为此,您可以将以下部分放入工作区根目录中:

  • pnpm-workspace.yaml配置pnpm 工作区包列表
  • pnpm-lock.yaml记录如何解决所有直接和间接 npm 依赖项
  • WORKSPACE.bazel建立rules_js
  • package.json以避免混淆pnpm,并且如果您需要 IDE 或类似的全局脚本或设置
  • BUILD.bazel创建虚拟商店npm_link_all_packages

在每个 pnpm 工作区包中$PACKAGE放入:

  • $PACKAGE/package.json配置直接 npm 依赖项$PACKAGE
  • $PACKAGE/BUILD.bazelnode_modules folder在 bin 树中创建npm_link_all_packages, 和 为您js_library或类似的

因此,每个 pnpm 工作区包也是一个 bazel 包(因为它有一个BUILD.bazel)。

如何在 中引用我的 npm 依赖项deps

depsofjs_library和类似中,您可以指向node_modules由 生成的文件夹中的依赖项npm_link_all_packages。通常, 与js_library位于同一个 Bazel 包中npm_link_all_package,因此您可以只使用:node_modules/$DEPENDENCY. 如果js_library位于 的子包中$PACKAGE,则可以改用//$PACKAGE:node_modules/$DEPENDENCY。然后在您的 JavaScript 文件中,您可以import from "$DEPENDENCY"require("$DEPENDENCY"). 这将在运行时起作用,因为该node_modules文件夹将位于运行文件中的适当位置以便node找到它。

我的工作区中的包如何相互引用?

如果您希望一个包$PACKAGE依赖于另一个包$OTHER,您可以像往常一样使用pnpm"$OTHER": "workspace:*"将 a 放入其中。您还必须确保(例如,)的默认目标是规则。然后,您可以在 a 或类似的 deps 中使用or来引用,就像引用 npm 依赖项一样。$PACKAGE/package.json$OTHER//some/path/to/other:othernpm_package:node_modules/$OTHER//$PACKAGE:node_modules/$OTHERjs_library$OTHER

我怎样才能创建pnpm-lock.yaml

请注意,这是一个工作pnpm设置,带有一些附加BUILD.bazel文件,因此您可以:

  • 用于pnpm install --lockfile-only创建pnpm-lock.yaml
  • 用于pnpm install创建pnpm-lock.yamlnode_modules在源树中创建文件夹。这些文件夹对于您的 IDE 来说不是必需的,rules_js但可能会有所帮助。