【问题标题】:Is there a way to make Bazel work with transitive repositories?有没有办法让 Bazel 与传递存储库一起工作?
【发布时间】:2019-11-13 22:26:37
【问题描述】:

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

【问题讨论】:

    标签: build repository bazel workspace


    【解决方案1】:

    WORKSPACE 文件可以load 然后调用macros,这提供了与#include 类似的功能。

    一种常见的模式是每个项目都有一个宏,该宏调用宏(用于依赖于其他项目)并创建*_archive 规则(用于直接依赖于要下载的文件)以便构建。例如,protobuf 有protobuf_deps 来实现这个模式。如果您使用 protobuf 创建存储库(使用 git_repositoryhttp_archive 或任何其他存储库规则),那么您可以加载该宏并调用它,您将自动获取所有传递依赖项。

    例如(from Chromium):

    load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
    # This com_google_protobuf repository is required for proto_library rule.
    # It provides the protocol compiler binary (i.e., protoc).
    http_archive(
        name = "com_google_protobuf",
        strip_prefix = "protobuf-master",
        urls = ["https://github.com/protocolbuffers/protobuf/archive/master.zip"],
    )
    load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps")
    protobuf_deps()
    

    我显示 http_archive 是因为它更易于使用,但如果需要,您可以轻松地将其更改为 git_archive

    另一个使这一切正常工作的常见模式是protobuf_deps 在创建每个http_archive 之前检查native.existing_rule。这允许您直接在 WORKSPACE 文件中实例化依赖项的特定版本(或来自特定源等),以覆盖一个 protobuf 否则会引入。

    【讨论】:

    • Brian,我正在尝试按照您解释的模式进行操作,但据我了解,它仅适用于一层深度,并且在传递依赖链的下游不起作用。在 WORKSPACE 文件中,我们可以声明 repo、加载 .bzl 文件并从中调用函数。在该函数内部,我们可以声明更多的 repos,但是我们不能在函数内部使用“load”,因此不能递归地使用这个模式。我们仍然必须手动将所有“加载”语句和 _deps 函数调用汇总到根 WORKSPACE 文件的所有传递依赖项。不可维护。你的想法?
    • 您可以将传递依赖项的每个部分(http_archiveload)捆绑在单独的 .bzl 文件中。然后可以递归地使用这些。例如,Bazel Federation 将此模式用于许多存储库。他们的adding your repo to the Federation 步骤列表讨论了每一部分。
    猜你喜欢
    • 2020-03-09
    • 1970-01-01
    • 2013-03-27
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 2023-03-28
    相关资源
    最近更新 更多