常见问题解答

报告问题 查看源代码 每夜 build · 8.0 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

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

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

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

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

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

如何为 Starlark 代码编写文档?

对于规则和规则属性,您可以将 docstring 字面量(可能带有三重引号)传递给 ruleattr.*()doc 参数。对于辅助函数和宏,请使用三重引号 Docstring 字面量,并遵循此处给出的格式。规则实现函数通常不需要自己的 docstring。

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