问题描述
通过http_archive下载档案后,我想运行一个脚本,以从文件夹结构和其中的Cmake文件生成BUILD文件(我目前是手工完成的,可以很容易地编写脚本)。我在starlark文档中没有找到有关如何打开,读取和写入文件的任何信息,但是由于http_archive本身是从bzl文件加载的(尽管尚未找到该文件的源...)并生成BUILD文件(通过从存档中解压缩它们)我想必须有可能为http_archive写一个包装程序,该包装程序还会生成BUILD文件?
解决方法
这是自定义repository rule的完美用例。这样一来,您可以运行任意命令来生成存储库文件,还可以使用一些助手来执行常见操作,例如使用存储库缓存通过HTTP下载文件(如果已配置)。存储库规则在概念上与普通规则相似,但是具有更少的基础结构,因为它在loading phase期间运行,而大多数Bazel基础结构尚未应用。
http_archive
的starlark实现是in http.bzl。它的核心是对ctx.download_and_extract
的单个调用。您的自定义规则也应该这样做。 http_archive
然后从workspace_and_buildfile
调用patch
和util.bzl
,听起来像。您应该调用ctx.execute
而不是workspace_and_buildfile
来运行命令来生成BUILD文件。您可以根据需要致电patch
,或者如果不想使用该功能,请跳过该功能。
如果您想进一步扩展存储库规则的实现功能,则文档中的repository_ctx页是顶层参考。
,使用http_archive
时,可以使用build_file
参数创建BUILD文件。为了动态生成它,我认为您可以使用patch_cmds
参数来运行外部命令。