You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在BUILD文件中获取当前包的标签?

在Bazel BUILD文件中获取当前包标签的方法

你没法直接在BUILD文件里调用native.package_relative_label()或Label()这类函数——因为BUILD文件是声明性配置文件,不支持调用native模块的API,这些API只能在.bzl文件的规则实现或宏中使用。要实现你需要的?CURRENT_PACKAGE?替换,有两种可行方案:

方案1:在自定义规则实现中自动注入包名

如果do_x_or_fail是你自己定义的规则,修改其.bzl文件中的实现逻辑,通过规则上下文ctx获取当前包路径:

  1. 在规则实现文件(比如my_rules.bzl)中,通过ctx.label.package拿到当前包的路径:
def _do_x_or_fail_impl(ctx):
    # 获取当前规则所在的包路径
    current_package = ctx.label.package
    
    # 替换消息中的占位符(或直接拼接)
    error_message = ctx.attr.message_on_error.format(CURRENT_PACKAGE=current_package)
    
    # 你的规则逻辑:比如检查失败时抛出错误
    if not ctx.attr.some_required_condition:
        fail(error_message)

# 定义规则
do_x_or_fail = rule(
    implementation = _do_x_or_fail_impl,
    attrs = {
        "message_on_error": attr.string(
            default = "Incorrect setup for {CURRENT_PACKAGE}"
        ),
        # 其他规则属性...
        "some_required_condition": attr.bool(),
    },
)
  1. 在BUILD文件中调用规则时,用{CURRENT_PACKAGE}作为占位符:
do_x_or_fail(
    name = "foo",
    some_required_condition = False,
    message_on_error = "Incorrect BarBaz setup for {CURRENT_PACKAGE}. Check Xyz."
)

方案2:通过宏自动填充包名

如果do_x_or_fail是已有的规则,你可以用宏来封装调用逻辑,在宏中获取当前包名并替换占位符:

  1. 在.bzl文件中定义宏:
def do_x_or_fail(name, message_on_error_template, **kwargs):
    # 在宏中调用native.package_name()获取当前包名
    current_package = native.package_name()
    # 替换模板中的占位符
    filled_message = message_on_error_template.replace("?CURRENT_PACKAGE?", current_package)
    
    # 调用原规则
    native.do_x_or_fail(
        name = name,
        message_on_error = filled_message,
        **kwargs
    )
  1. 在BUILD文件中调用这个宏:
do_x_or_fail(
    name = "foo",
    message_on_error_template = "Incorrect BarBaz setup for ?CURRENT_PACKAGE?. Check Xyz.",
    # 其他规则参数...
)

关键说明

  • BUILD文件仅负责声明目标,无法执行动态逻辑;所有需要动态获取上下文(比如当前包名)的操作,都要放到.bzl文件的规则或宏中完成。
  • ctx.label.package返回的是相对于工作区根目录的包路径(比如src/main/java/com/example),而native.package_name()的返回值和它一致。

内容的提问来源于stack exchange,提问作者Max

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 13:32:24