Build 有没有办法让Bazel与可传递的存储库一起工作?

Build 有没有办法让Bazel与可传递的存储库一起工作?,build,repository,bazel,workspace,Build,Repository,Bazel,Workspace,我使用分布在许多存储库中的大量代码库,并使用更多的第三方依赖项。目标是使构建更加气密,我考虑使用Bazel来实现它。一方面,Bazel有git_存储库规则来引用工作区文件中的外部回购。另一方面,工作区文件不是递归加载的,所以为了获得间接依赖关系,我需要以某种方式构建包含所有内容的工作区文件。我想知道是否有人已经使用Bazel或其他现有工具解决了这个问题。有没有办法将工作区扩展为构建的一部分?可能是工作区可以包含其他(生成的)文件吗?工作区文件可以,然后调用,这提供了与“包含”类似的功能 一种常见

我使用分布在许多存储库中的大量代码库,并使用更多的第三方依赖项。目标是使构建更加气密,我考虑使用Bazel来实现它。一方面,Bazel有git_存储库规则来引用工作区文件中的外部回购。另一方面,工作区文件不是递归加载的,所以为了获得间接依赖关系,我需要以某种方式构建包含所有内容的工作区文件。我想知道是否有人已经使用Bazel或其他现有工具解决了这个问题。有没有办法将工作区扩展为构建的一部分?可能是工作区可以包含其他(生成的)文件吗?

工作区文件可以,然后调用,这提供了与“包含”类似的功能

一种常见的模式是每个项目都有一个宏,该宏调用宏(用于对其他项目的依赖项)并创建
*\u归档
规则(用于直接对要下载的文件的依赖项),以便生成。例如,protobuf必须实现这个模式。如果使用protobuf(使用
git_repository
,或
http_archive
,或任何其他存储库规则)创建存储库,则可以加载该宏并调用它,您将自动获得所有可传递的依赖项

例如():

load(“@bazel\u tools//tools/build\u defs/repo:http.bzl”,“http\u archive”)
#此com_google_protobuf存储库是proto_库规则所必需的。
#它提供协议编译器二进制文件(即protoc)。
http\u档案(
name=“com\u google\u protobuf”,
strip_prefix=“protobuf master”,
URL=[”https://github.com/protocolbuffers/protobuf/archive/master.zip"],
)
加载(“@com\u google\u protobuf/:protobuf\u deps.bzl”,“protobuf\u deps”)
protobuf_deps()
我正在显示
http\u归档
,因为它更易于使用,但如果您愿意,您可以轻松地将其更改为
git\u归档

另一种常见的模式是
protobuf\u deps
在创建每个
http\u归档文件之前检查
native.existing\u rule
。这允许您直接在工作区文件中实例化依赖项的特定版本(或来自特定源等),以覆盖否则将引入的一个协议。

工作区文件可以,然后调用,这将提供类似的功能来包含

一种常见的模式是每个项目都有一个宏,该宏调用宏(用于对其他项目的依赖项)并创建
*\u归档
规则(用于直接对要下载的文件的依赖项),以便生成。例如,protobuf必须实现这个模式。如果使用protobuf(使用
git_repository
,或
http_archive
,或任何其他存储库规则)创建存储库,则可以加载该宏并调用它,您将自动获得所有可传递的依赖项

例如():

load(“@bazel\u tools//tools/build\u defs/repo:http.bzl”,“http\u archive”)
#此com_google_protobuf存储库是proto_库规则所必需的。
#它提供协议编译器二进制文件(即protoc)。
http\u档案(
name=“com\u google\u protobuf”,
strip_prefix=“protobuf master”,
URL=[”https://github.com/protocolbuffers/protobuf/archive/master.zip"],
)
加载(“@com\u google\u protobuf/:protobuf\u deps.bzl”,“protobuf\u deps”)
protobuf_deps()
我正在显示
http\u归档
,因为它更易于使用,但如果您愿意,您可以轻松地将其更改为
git\u归档


另一种常见的模式是
protobuf\u deps
在创建每个
http\u归档文件之前检查
native.existing\u rule
。这允许您直接在工作区文件中实例化依赖项的特定版本(或来自特定源等),以覆盖protobuf将引入的版本。

Brian,我正在尝试遵循您解释的模式,但据我所知,它只在一个层次上起作用,不能在可传递依赖关系的链条上进一步发挥作用。在工作区文件中,我们可以声明repo、加载.bzl文件并从中调用函数。在这个函数中,我们可以声明更多的repo,但是我们不能在函数中使用“load”,因此不能递归地使用这个模式。我们仍然必须手动将所有可传递依赖项的“load”语句和_deps函数调用汇总到根工作区文件。不可维护。您的想法?您可以将每个部分(
http\u archive
load
)捆绑在单独的.bzl文件中,以获得可传递的依赖项。然后可以递归地使用它们。例如,对许多存储库使用此模式。Brian,我正试图遵循你解释的模式,但据我所知,它只在一个层次上起作用,不能在可传递依赖关系链的下一个层次起作用。在工作区文件中,我们可以声明repo、加载.bzl文件并从中调用函数。在这个函数中,我们可以声明更多的repo,但是我们不能在函数中使用“load”,因此不能递归地使用这个模式。我们仍然必须手动将所有可传递依赖项的“load”语句和_deps函数调用汇总到根工作区文件。不可维护。您的想法?您可以将每个部分(
http\u archive
load
)捆绑在单独的.bzl文件中,以获得可传递的依赖项。然后可以递归地使用它们。例如,对许多存储库使用此模式。他们关于每件作品的讨论步骤清单。