Bazel 的 select 没有被解释
Bazel's select isn't interpreted
我正在尝试在当前操作系统上设置条件(在 Bazel 4.2.2 中):
is_darwin = select({
"@bazel_tools//src/conditions:darwin": True,
"//conditions:default": False,
})
if is_darwin:
# a
else:
# b
然而我陷入a
,即使我在Linux。
我试过打印出来,但是好像没有评价:
DEBUG: WORKSPACE:65:6: select({"@bazel_tools//src/conditions:darwin": True, "//conditions:default": False})
如何正确检查?
Select 仅在 rule implementation functions, not macros like you're using. You'll need to use attr.bool 中评估以创建属性,将 select 传递给它,然后基于该执行逻辑。
你也可以直接用ctx.target_platform_has_constraint来做,不用select:
def _impl(ctx):
darwin_constraint = ctx.attr._darwin_constraint[platform_common.ConstraintValueInfo]
if ctx.target_platform_has_constraint(darwin_constraint):
print('on darwin')
else:
print('not darwin')
my_rule = rule(
implementation = _impl,
attrs = {
...
'_darwin_constraint': attr.label(default = '@bazel_platforms//os:darwin'),
},
)
查看差异的另一种方法是加载 BUILD 文件和 运行ning 宏发生在 loading phase 中,但评估 selects 发生在加载和分析阶段之间。相关步骤是:
- 加载阶段生成目标图和它们之间的转换。这些目标将规则绑定到一组属性值,其中包括未评估的 selects.
- 此图与 command-line 标志相结合,为每个目标生成一个或多个 configurations。
- 每个目标都使用适用于它的每个配置进行评估,selects 解析为适合该配置。实际上,在评估 selects 之后,实现函数是 运行 以及来自目标的属性值。这会生成配置的目标。
我正在尝试在当前操作系统上设置条件(在 Bazel 4.2.2 中):
is_darwin = select({
"@bazel_tools//src/conditions:darwin": True,
"//conditions:default": False,
})
if is_darwin:
# a
else:
# b
然而我陷入a
,即使我在Linux。
我试过打印出来,但是好像没有评价:
DEBUG: WORKSPACE:65:6: select({"@bazel_tools//src/conditions:darwin": True, "//conditions:default": False})
如何正确检查?
Select 仅在 rule implementation functions, not macros like you're using. You'll need to use attr.bool 中评估以创建属性,将 select 传递给它,然后基于该执行逻辑。
你也可以直接用ctx.target_platform_has_constraint来做,不用select:
def _impl(ctx):
darwin_constraint = ctx.attr._darwin_constraint[platform_common.ConstraintValueInfo]
if ctx.target_platform_has_constraint(darwin_constraint):
print('on darwin')
else:
print('not darwin')
my_rule = rule(
implementation = _impl,
attrs = {
...
'_darwin_constraint': attr.label(default = '@bazel_platforms//os:darwin'),
},
)
查看差异的另一种方法是加载 BUILD 文件和 运行ning 宏发生在 loading phase 中,但评估 selects 发生在加载和分析阶段之间。相关步骤是:
- 加载阶段生成目标图和它们之间的转换。这些目标将规则绑定到一组属性值,其中包括未评估的 selects.
- 此图与 command-line 标志相结合,为每个目标生成一个或多个 configurations。
- 每个目标都使用适用于它的每个配置进行评估,selects 解析为适合该配置。实际上,在评估 selects 之后,实现函数是 运行 以及来自目标的属性值。这会生成配置的目标。