如何在Bazel中将select对象拼接至列表属性中
问题原因
你遇到的报错是因为select是Bazel的延迟求值特殊对象,不能直接和普通列表用+运算符拼接,BUILD文件解析阶段只会把select当成占位符处理,不会直接生成实际的列表值。
解决方案
方案1:无额外依赖的原生写法
Bazel原生支持select对象之间用+拼接,也支持将普通常量列表自动提升为仅含默认分支的select对象,你只需要保证所有需要拼接的select都设置空列表作为默认分支即可,示例代码如下:
glob_tests( # some stuff exclude = [ "a.foo", ] + select({ "//path/to/condition:A": ["x.foo"], "//conditions:default": [], }) + select({ "//path/to/condition:B": ["y.foo"], "//conditions:default": [], }), )
如果你的if_A、if_B函数已经内置了默认分支返回空列表的逻辑,代码可以直接简化为:
glob_tests( # some stuff exclude = ["a.foo"] + if_A(["x.foo"]) + if_B(["y.foo"]), )
方案2:使用bazel_skylib的selects.concat工具
如果你的项目已经引入了bazel_skylib依赖,可以直接使用封装好的selects.concat函数完成多段列表+select的拼接,写法更简洁:
load("@bazel_skylib//lib:selects.bzl", "selects") glob_tests( # some stuff exclude = selects.concat( ["a.foo"], if_A(["x.foo"]), if_B(["y.foo"]), ), )
内容的提问来源于stack exchange,提问作者rohitsan
相关产品推荐
相关产品推荐

