单个或多个 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 中提取还是位于同一棵树中真的无关紧要。它需要重建,但也会被缓存,无论哪种方式。
我们将所有产品和库放在一个单一的 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 中提取还是位于同一棵树中真的无关紧要。它需要重建,但也会被缓存,无论哪种方式。