以下是与写作扩展程序相关的一些常见问题。
为什么我的文件未生成 / 我的操作从未执行?
Bazel 仅执行生成请求的输出文件所需的操作。
如果您要下载的文件带有标签,您可以直接请求下载:
bazel build //pkg:myfile.txt
如果该文件位于目标的输出组中,您可能需要在命令行中指定该输出组:
bazel build //pkg:mytarget --output_groups=foo
如果您希望在命令行中提及目标文件时自动构建该文件,请返回
DefaultInfo
提供程序,将该文件添加到规则的默认输出中。
如需了解详情,请参阅“规则”页面。
为什么我的实现函数未执行?
Bazel 仅分析构建请求的目标。您应在命令行中为目标命名,或为依赖于目标的某个对象命名。
执行我的操作或二进制文件时缺少文件
请确保:1) 该文件已注册为操作或二进制文件的输入;2) 正在执行的脚本或工具是使用正确的路径访问该文件。
对于操作,您可以通过将输入传递给用于创建操作的 ctx.actions.*
函数来声明输入。您可以使用 File.path
获取文件的正确路径。
对于二进制文件(由 bazel run
或 bazel test
命令运行的可执行输出),您可以通过将其添加到 runfiles 中来声明输入。请改用 File.short_path
(相对于二进制文件执行的 runfiles 目录的文件路径),而不是使用 path
字段。
如何控制 bazel build //pkg:mytarget
构建哪些文件?
使用 DefaultInfo
提供程序设置默认输出。
如何在 build 中运行程序或执行文件 I/O?
工具可以像 build 的任何其他部分一样声明为目标,并在执行阶段运行以帮助构建其他目标。如需创建用于运行工具的操作,请使用 ctx.actions.run
,并将工具作为 executable
参数传入。
在加载和分析阶段,工具无法运行,您也无法执行文件 I/O。这意味着,工具和文件内容(BUILD 和 .bzl 文件的内容除外)无法影响目标图和操作图的创建方式。
如果我在执行阶段之前和执行阶段都需要访问相同的结构化数据,该怎么办?
您可以将结构化数据格式化为 .bzl 文件。您可以在加载和分析阶段load()
该文件,以便访问该文件。您可以将其作为输入或 runfile 传递给在执行阶段需要它的操作和可执行文件。
如何为 Starlark 代码编写文档?
对于规则和规则属性,您可以将 docstring 字面量(可能带有三重引号)传递给 rule
或 attr.*()
的 doc
参数。对于辅助函数和宏,请使用三重引号 Docstring 字面量,并遵循此处给出的格式。规则实现函数通常不需要自己的 docstring。
在预期位置使用字符串字面量有助于自动化工具更轻松地提取文档。在任何可能帮助读者了解代码的地方,都可以随意使用标准的非字符串注释。