常见问题解答

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

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

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中来声明输入。请勿使用 path 字段,而应使用 File.short_path,它是文件相对于 二进制文件执行的 runfiles 目录的路径。

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

使用 DefaultInfo 提供方 设置默认输出

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

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

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

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

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

如何记录 Starlark 代码?

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

在预期位置使用字符串字面量有助于自动化工具提取文档。您可以随意使用标准非字符串注释,只要它有助于读者了解您的代码即可。