常见问题解答

<ph type="x-smartling-placeholder"></ph> 报告问题 查看来源 敬上 每晚 · 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。不要使用 path 字段,而应使用 File.short_path,这是相对于 执行二进制文件的 runfiles 目录

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

使用 DefaultInfo 提供程序执行以下操作: 设置默认输出

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

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

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

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

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

如何记录 Starlark 代码?

对于规则和规则属性,您可以传递文档字符串字面量(可能是 三引号)添加到 ruleattr.*()doc 形参中。助手 函数和宏,请遵循以下格式,使用三引号引起来的文档字符串字面量: 此处。 规则实现函数通常不需要自己的文档字符串。

在预期位置使用字符串字面量可以 来提取文档您可以随意使用标准的非字符串注释 任何可能对代码读者有帮助的地方。