bazel - Bazel Starlark:如何以程序方式生成 BUILD 文件?
问题描述
通过 http_archive 下载存档后,我想运行一个脚本以从文件夹结构和其中的 Cmake 文件生成 BUILD 文件(我目前是手动完成的,它很容易编写脚本)。我在 starlark 文档中没有找到任何关于如何打开、读取和写入文件的信息,但是由于 http_archive 本身是从 bzl 文件加载的(虽然还没有找到该文件的源......)并生成 BUILD 文件(通过从档案中解压缩它们)我想必须可以为 http_archive 编写一个包装器,它也会生成 BUILD 文件?
解决方案
这是自定义存储库规则的完美用例。这使您可以运行任意命令来为存储库生成文件,以及一些用于常见操作的帮助程序,例如使用存储库缓存(如果已配置)通过 HTTP 下载文件。存储库规则在概念上类似于普通规则,但基础架构要少得多,因为它在大多数 Bazel 基础架构尚未应用的加载阶段运行。
starlark 的实现http_archive
在http.bzl 中。它的核心是对ctx.download_and_extract
. 您的自定义规则也应该这样做。http_archive
然后调用workspace_and_buildfile
和patch
from util.bzl
,它们听起来像。而不是workspace_and_buildfile
,您应该调用ctx.execute
以运行您的命令来生成 BUILD 文件。如果你愿意,你可以打电话patch
,或者如果你不打算使用它,可以跳过这个功能。
如果您想进一步扩展它,文档中的repository_ctx页面是您的存储库规则的实现功能可以做的所有事情的顶级参考。
推荐阅读
- java - 在一维战舰游戏Java中实现第二艘船
- postgresql - 如何使用 Postgres 创建 trigram 或 ngram 单词
- node.js - Vercel.com 托管:开发和生产 URL
- javascript - 仅在子组件中使用道具是不好的做法吗?没有自己状态的子组件
- c - 在 C 中将 uint_8* 转换为任何类型,比如“double”或结构?
- reactjs - 如果 Apollo GraphQL 令牌无效或已过期,则 NextAuth.js 注销
- php - 正则表达式匹配特定字符串而没有其他字符串
- python - Python - 保存循环输出
- bash - bash,如何将下载的文件(使用 curl)点源到 bash
- python - 根据多列条件替换 Pandas 中的 NaN