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

Bazel Starlark:如何按程序生成构建文件?,bazel,bazel-rules,starlark,Bazel,Bazel Rules,Starlark,通过http_archive下载归档文件后,我想运行一个脚本,从文件夹结构中生成一个构建文件,并在其中生成Cmake文件(目前我是手动完成的,很容易编写脚本)。我在starlark文档中找不到任何关于如何打开、读取和写入文件的内容,但由于http_存档本身是从bzl文件加载的(虽然还没有找到该文件的源…),并生成生成构建文件(通过从存档中解包)我想一定可以为http_归档编写一个包装器,该包装器也会生成生成文件?使用时,可以使用BUILD_file参数来创建生成文件。要动态生成它,我认为可以使用

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

使用时,可以使用
BUILD_file
参数来创建生成文件。要动态生成它,我认为可以使用
patch\u cmds
参数来运行外部命令。

使用时,可以使用
build\u file
参数来创建生成文件。要动态生成它,我认为您可以使用
patch\u cmds
参数来运行外部命令。

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

http\u归档文件的starlark实现是。它的核心是一次呼叫。您的自定义规则也应该这样做
http\u archive
然后从
util.bzl
调用
workspace\u和_buildfile
patch
,它们执行听起来像什么的操作。您应该调用来运行生成生成文件的命令,而不是
工作区和构建文件。如果需要,可以调用
patch
,如果不打算使用该功能,可以跳过该功能


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

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

http\u归档文件的starlark实现是。它的核心是一次呼叫。您的自定义规则也应该这样做
http\u archive
然后从
util.bzl
调用
workspace\u和_buildfile
patch
,它们执行听起来像什么的操作。您应该调用来运行生成生成文件的命令,而不是
工作区和构建文件。如果需要,可以调用
patch
,如果不打算使用该功能,可以跳过该功能

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