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

问题描述

通过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调用patchutil.bzl,听起来像。您应该调用ctx.execute而不是workspace_and_buildfile来运行命令来生成BUILD文件。您可以根据需要致电patch,或者如果不想使用该功能,请跳过该功能。

如果您想进一步扩展存储库规则的实现功能,则文档中的repository_ctx页是顶层参考。

,

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...