Bazel Starlark:如何按程序生成 BUILD 文件?

use*_*931 4 bazel starlark bazel-rules

通过 http_archive 下载存档后,我想运行一个脚本来从文件夹结构和其中的 Cmake 文件生成 BUILD 文件(我目前手动执行此操作,并且很容易编写脚本)。我在 starlark 文档中没有找到有关如何打开、读取和写入文件的任何内容,但由于 http_archive 本身是从 bzl 文件加载的(尽管尚未找到该文件的源...)并生成 BUILD 文件(通过从档案中解压它们)我想一定可以为 http_archive 编写一个包装器来生成 BUILD 文件?

Bri*_*man 6

这是自定义存储库规则的完美用例。这允许您运行任意命令来生成存储库的文件,以及一些用于常见操作的帮助程序,例如使用存储库缓存(如果配置)通过 HTTP 下载文件。存储库规则在概念上类似于普通规则,但基础设施要少得多,因为它在加载阶段运行,而此时大多数 Bazel 基础设施尚未应用。

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

如果您想进一步扩展它,文档中的repository_ctx页面是您的存储库规则的实现函数可以执行的所有操作的顶级参考。