单个或多个 bazel WORKSPACE 应该用于整体回购?

Single or multiple bazel WORKSPACE should be used for monolithic repo?

我们将所有产品和库放在一个单一的 git 存储库中。它的布局如下所示:

- FooProduct
- BarProduct
- BazLibrary
- 3rd_party
 |- fftw
 |- msgpack
 |- zlib

目前,我们正在使用 CMake 来控制构建。由于 CMake 将配置、生成和构建阶段分开,如果将所有东西一起生成,运行 将花费非常长的时间。为避免这种情况,我们为每个部分提供顶级 CMakeLists.txt,并通过上级 add_subirectory 调用引用同行项目。例如:

# FooProduct/CMakeLists.txt
project(FooProduct)
add_subdirectory(../BazLibrary sibling/BazLibrary)
add_subdirectory(../3rd_party/zlib sibling/3rd_party/zlib)
......

现在我们正在评估 Bazel,我立即想到了一个问题:我是否应该只在 git 存储库的顶部目录中放置一个 WORKSPACE

- WORKSPACE
- FooProduct
- BarProduct
- BazLibrary
- 3rd_party
 |- fftw
 |- msgpack
 |- zlib

或者在每个 product/library 中放置许多 WORKSPACE 个文件并使用 local_repository 规则相互引用?

- FooProduct
 |- WORKSPACE
- BarProduct
 |- WORKSPACE
- BazLibrary
 |- WORKSPACE
- 3rd_party
 |- fftw
   |- WORKSPACE
 |- msgpack
   |- WORKSPACE
 |- zlib
   |- WORKSPACE

根据定义,单个工作区或 source/build 树只有一个(顶级)WORKSPACE。理论上你可以放置树的 WORKSPACE 个分支,但一个明显的混淆来源是,当 运行 bazel 从目录中另一个 WORKSPACE 沿着路径时,你无法达到项目目标在 cwd 和项目根目录之间。虽然在 return.

中你不会真正获得任何东西

如果您想将配置分布在多个目录(甚至子模块)中,您可以添加 Starlark (.bzl) 文件,其中包含定义相应存储库规则目标(外部依赖项)的宏 ("functions") ) 树中的任何位置(例如 //3rd_party/...)并在您的(项目)WORKSPACE 文件中加载并执行相应的相应定义。

但这更像是一个组织问题(例如,不同的 people/groups 维护不同的依赖关系;或者只是保持文件小),它有效地工作(最终被评估)就像有一个大的 WORKSPACE 文件。

如果外部依赖被称为源和BUILD描述。它是从完全不同的 repo 中提取还是位于同一棵树中真的无关紧要。它需要重建,但也会被缓存,无论哪种方式。