常见问题解答

报告问题 查看源代码 每夜版 · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

以下是编写扩展程序时遇到的一些常见问题。

为什么我的文件未生成 / 我的操作从未执行?

Bazel 只会执行生成请求的输出文件所需的操作。

  • 如果您想要的文件带有标签,可以直接申请: bazel build //pkg:myfile.txt

  • 如果该文件位于目标的输出组中,您可能需要在命令行中指定该输出组: bazel build //pkg:mytarget --output_groups=foo

  • 如果您希望在命令行中提及目标时自动构建文件,请通过返回 DefaultInfo 提供程序将其添加到规则的默认输出中。

如需了解详情,请参阅“规则”页面

为什么我的实现函数未执行?

Bazel 仅分析构建请求中指定的目标。您应在命令行中指定目标,或指定取决于目标的某些内容。

执行操作或二进制文件时缺少文件

请确保:1) 该文件已注册为操作或二进制文件的输入;2) 正在执行的脚本或工具正在使用正确的路径访问该文件。

对于操作,您可以通过将输入传递给创建操作的 ctx.actions.* 函数来声明输入。可以使用 File.path 获取文件的正确路径。

对于二进制文件(通过 bazel runbazel test 命令运行的可执行输出),您可以通过将输入包含在 runfiles 中来声明输入。请使用 File.short_path(文件相对于二进制文件执行的 runfiles 目录的路径),而不是使用 path 字段。

如何控制 bazel build //pkg:mytarget 构建哪些文件?

使用 DefaultInfo 提供程序设置默认输出

如何在 build 过程中运行程序或执行文件 I/O?

工具可以像 build 的任何其他部分一样声明为目标,并在执行阶段运行以帮助 build 其他目标。如需创建运行工具的操作,请使用 ctx.actions.run 并将工具作为 executable 形参传入。

在加载和分析阶段,工具无法运行,您也无法执行文件 I/O。这意味着,工具和文件内容(BUILD 和 .bzl 文件的内容除外)无法影响目标和操作图的创建方式。

如果我需要在执行阶段之前和期间访问相同的结构化数据,该怎么办?

您可以将结构化数据格式化为 .bzl 文件。您可以 load() 该文件,以便在加载和分析阶段访问它。您可以将其作为输入或 runfile 传递给在执行阶段需要它的操作和可执行文件。

如何记录 Starlark 代码?

对于规则和规则属性,您可以将 docstring 字面值(可能使用三引号)传递给 ruleattr.*()doc 参数。对于辅助函数和宏,请使用三引号括起来的文档字符串字面量,格式如此处所示。 规则实现函数通常不需要自己的文档字符串。

在预期位置使用字符串字面量可让自动化工具更轻松地提取文档。您可以随意使用标准非字符串注释,以便帮助读者了解您的代码。