如何将 select 个对象连接到 bazel 中的列表
How to concantenate select objects to a list in bazel
我有一个 bazel 目标,其属性必须是一个列表。
但是,我需要select根据 select 的结果向列表中主动添加元素。
glob_tests(
# some stuff
exclude = [
"a.foo",
] + if_A([
"x.foo",
]) + if_B([
"y.foo",
]),
)
在上面的代码片段中,函数 if_A 和 if_B return select 对象。
但是当我按原样 运行 时,我收到一条错误消息,指出需要一个序列对象,但遇到了一个 select 对象。
如何将 select 对象转换为序列对象?
(我假设 glob_test
是调用内置函数 glob
的宏。)在加载 BUILD
文件时评估 glob,这是在已知任何配置之前。这意味着 glob
不能将任何 select
对象作为输入,因为不存在将 select
对象转换为列表的知识。
解决这个问题的方法是像这样将 select
调用提升到 globs 之上
some_test(
name = "some_test",
srcs = select({
"//cond1": glob(["t*", "s*"], exclude=["thing"]),
"//cond2": glob(["t*", "s*"], exclude=["something else"]),
}),
)
而不是
some_test(
name = "some_test",
srcs = glob(
["t*", "s*"],
exclude=select({
"//cond1": ["thing"],
"//cond2": ["something else"],
}),
),
)
我有一个 bazel 目标,其属性必须是一个列表。
但是,我需要select根据 select 的结果向列表中主动添加元素。
glob_tests(
# some stuff
exclude = [
"a.foo",
] + if_A([
"x.foo",
]) + if_B([
"y.foo",
]),
)
在上面的代码片段中,函数 if_A 和 if_B return select 对象。
但是当我按原样 运行 时,我收到一条错误消息,指出需要一个序列对象,但遇到了一个 select 对象。
如何将 select 对象转换为序列对象?
(我假设 glob_test
是调用内置函数 glob
的宏。)在加载 BUILD
文件时评估 glob,这是在已知任何配置之前。这意味着 glob
不能将任何 select
对象作为输入,因为不存在将 select
对象转换为列表的知识。
解决这个问题的方法是像这样将 select
调用提升到 globs 之上
some_test(
name = "some_test",
srcs = select({
"//cond1": glob(["t*", "s*"], exclude=["thing"]),
"//cond2": glob(["t*", "s*"], exclude=["something else"]),
}),
)
而不是
some_test(
name = "some_test",
srcs = glob(
["t*", "s*"],
exclude=select({
"//cond1": ["thing"],
"//cond2": ["something else"],
}),
),
)