【问题标题】:Bazel Starlark: how can I generate a BUILD file procedurally?Bazel Starlark:如何以程序方式生成 BUILD 文件?
【发布时间】:2020-12-02 08:20:26
【问题描述】:

通过 http_archive 下载存档后,我想运行一个脚本以从文件夹结构和其中的 Cmake 文件生成 BUILD 文件(我目前是手动完成的,它很容易编写脚本)。我在 starlark 文档中没有找到任何关于如何打开、读取和写入文件的信息,但是由于 http_archive 本身是从 bzl 文件加载的(虽然还没有找到该文件的源......)并生成 BUILD 文件(通过从档案中解压缩它们)我想必须可以为 http_archive 编写一个包装器,它也会生成 BUILD 文件?

【问题讨论】:

    标签: bazel bazel-rules starlark


    【解决方案1】:

    使用http_archive 时,您可以使用build_file 参数来创建BUILD 文件。要动态生成它,我认为您可以使用patch_cmds 参数来运行外部命令。

    【讨论】:

      【解决方案2】:

      这是自定义repository rule 的完美用例。这使您可以运行任意命令来生成存储库的文件,以及一些用于常见操作的帮助程序,例如使用存储库缓存(如果已配置)通过 HTTP 下载文件。存储库规则在概念上与普通规则相似,但基础架构要少得多,因为它在 loading phase 期间运行,此时大部分 Bazel 基础架构尚未应用。

      http_archive 的starlark 实现是in http.bzl。它的核心是对ctx.download_and_extract 的一次调用。您的自定义规则也应该这样做。 http_archive 然后从util.bzl 调用workspace_and_buildfile 和patch,它们听起来像。而不是workspace_and_buildfile,您应该调用ctx.execute 来运行您的命令来生成BUILD 文件。如果您愿意,可以致电patch,或者如果您不打算使用该功能,则可以跳过它。

      文档中的repository_ctx 页面是您的存储库规则的实现功能可以做的所有事情的顶级参考,如果您想进一步扩展它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-29
        • 2014-08-10
        • 1970-01-01
        • 1970-01-01
        • 2015-08-15
        相关资源
        最近更新 更多