常见问题解答

以下是与编写扩展程序相关的一些常见问题。

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

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

  • 如果您所需的文件具有标签,可以直接请求该文件:bazel build //pkg:myfile.txt

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

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

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

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

Bazel 仅分析为构建请求的目标。您应该在命令行中为目标命名,或者使用取决于目标的名称。

执行我的操作或二进制文件时,文件缺失

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

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

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

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

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

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

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

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

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

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

如何记录 Starlark 代码?

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

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