假设我有这样的源文件:
.
├── config.json
└── test.sh
我想用这些文件创建一个sh_test
。
然而,当测试运行时,test.sh
期望config.json
在不同的地方:
.
├── configs
│ └── prod.json # config.json
└── test.sh
我不想重新安排我的源代码以满足test.sh
,我也不想添加一堆文件复制/移动到test.sh
的开始。
是否有可能告诉Bazel如何以任意方式安排test.sh
的文件?
理想的语法是这样的:
sh_test(
name = "test",
srcs = [ "test.sh" ],
data = {
"configs/prod.json": "config.json",
},
)
使用genrule
:
genrule(
name = "prod_json",
srcs = ["config.json"],
outs = ["configs/prod.json"],
cmd = "cp $< $@",
)
sh_test(
name = "test",
srcs = ["test.sh"],
data = ["configs/prod.json"],
)
或者,您可以编写一个宏来匹配问题中的语法:
# BUILD
load(":sh_test.bzl", "sh_test")
sh_test(
name = "test",
srcs = ["test.sh"],
data = {
"configs/test.json": "config_test.json",
"configs/staging.json": "config_staging.json",
"configs/prod.json": "config.json",
}
)
# sh_test.bzl
def sh_test(name, data = {}, **kwargs):
datas = []
for dest, src in data.items():
genrule_name = dest.replace("/", "_")
native.genrule(
name = genrule_name,
srcs = [src],
outs = [dest],
cmd = "cp $< $@",
)
datas.append(genrule_name)
native.sh_binary(
name = name,
data = datas,
**kwargs
)