1

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

4

2 回答 2

2

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

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

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

于 2020-08-12T21:18:48.590 回答
1

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

于 2020-08-12T18:27:43.313 回答