以下是与编写扩展程序相关的一些常见问题。
为什么我的文件没有生成 / 我的操作从未执行?
Bazel 仅执行生成所请求的输出文件所需的操作。
如果您所需的文件具有标签,您可以直接请求它:
bazel build //pkg:myfile.txt
如果该文件在目标的输出组中,您可能需要指定 输出组:
bazel build //pkg:mytarget --output_groups=foo
如果您希望在 请将它添加到规则的默认输出中 返回
DefaultInfo
提供程序。
如需了解详情,请参阅“规则”页面。
为什么我的实现函数未执行?
Bazel 仅分析为构建请求的目标。您应该 可以在命令行中为该目标命名,也可以指定一个取决于 目标。
在执行我的操作或二进制文件时,某个文件丢失
请确保:1) 该文件已注册为操作的输入;或 二进制文件;以及 2) 正在执行的脚本或工具使用 正确路径。
对于操作,您可以通过将输入传递给 ctx.actions.*
函数来声明输入
创建相应操作。可以使用
File.path
。
对于二进制文件(可执行输出由 bazel run
或 bazel 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 代码?
对于规则和规则属性,您可以传递文档字符串字面量(可能是
三引号)添加到 rule
或 attr.*()
的 doc
形参中。助手
函数和宏,请遵循以下格式,使用三引号引起来的文档字符串字面量:
此处。
规则实现函数通常不需要自己的文档字符串。
在预期位置使用字符串字面量可以 来提取文档您可以随意使用标准的非字符串注释 任何可能对代码读者有帮助的地方。