如何在Bazel的BUILD或rules.bzl文件中添加日志查看规则传入参数
Bazel 规则参数快速调试方案
不需要导入logging模块,Bazel的Starlark配置语言运行环境不支持引入Python标准库的logging组件,直接用内置的print()函数即可实现临时调试打印,无需额外配置。
不同场景的使用示例
在rules.bzl规则实现中打印传入参数
在规则的实现函数中直接调用print()即可读取传入的属性值:
def _custom_rule_impl(ctx): # 打印单个指定参数 print("传入的srcs参数值:", ctx.attr.srcs) # 批量打印所有非私有规则属性 for attr_name in dir(ctx.attr): if not attr_name.startswith("_"): attr_val = getattr(ctx.attr, attr_name) print(f"规则属性[{attr_name}]:{repr(attr_val)}") # 原有规则逻辑保持不变 ... custom_rule = rule( implementation = _custom_rule_impl, attrs = { "srcs": attr.label_list(allow_files = True), "output": attr.output(), "extra_args": attr.string_list(default = []), } )
在BUILD文件中打印参数
如果需要校验BUILD文件内的变量值、规则入参,直接在BUILD文件内调用print()即可:
# BUILD文件内容 lib_name = "demo_service" # 打印BUILD内定义的变量 print("当前构建的库名:", lib_name) custom_rule( name = lib_name, srcs = glob(["*.cc"]), output = "demo.bin", extra_args = ["--debug", "--verbose"], )
查看打印结果
正常执行Bazel构建/运行命令即可,打印内容会直接输出到命令行stderr流:bazel build //path/to:your_target
注意事项
- 调试完成后请及时删除打印语句,避免冗余输出影响构建日志可读性
- 打印复杂类型(如Label、结构体)时,配合
repr()函数可以得到更清晰的结构化输出
内容的提问来源于stack exchange,提问作者uh_big_mike_boi
相关产品推荐
相关产品推荐

