能否通过filegroup在cc_test数据依赖中重命名runfiles目录?
问题
我有一个关于cc_test数据依赖的问题:希望收集目录文件,并在runfiles中将该目录重命名为新名称,类似pkg_files的prefix功能。请问能否通过filegroup实现该需求?
我曾尝试使用pkg_tar和pkg_files来达成目标,相关Bazel代码如下:
cc_test( name = "my_test", srcs = ["src/test.cc"], data = [ ":data_artifacts", ], deps = [ "some_deps" ], ) pkg_tar( name = "data_files", srcs = [ "//my/this_is_a_pkg_files_deps:data", # 一个pkg_files依赖 ], include_runfiles = True, mode = "0644", ) genrule( name = "data_artifacts", srcs = [ ":data_files", ], outs = [ "artifacts", ], cmd = " && ".join([ "mkdir $@", "tar xf $(location :data_files) -C $@", ]), )
上述代码执行后,Bazel给出如下警告:
output '//my/artifacts' of //my:data_artifacts is a directory; dependency checking of directories is unsound
解决方案
filegroup无法直接实现目录重命名(prefix)的需求,因为它仅负责聚合文件,不会修改文件的路径结构。你之前的方案触发警告是因为Bazel对目录作为genrule输出的依赖检查机制不完善,以下是两种更可靠的解决方式:
方式一:用pkg_files直接设置prefix(推荐)
借助rules_pkg的pkg_files规则,直接通过prefix参数指定runfiles中的目标目录名,无需额外打包和解包操作:
load("@rules_pkg//:pkg.bzl", "pkg_files") pkg_files( name = "renamed_data", srcs = ["//my/this_is_a_pkg_files_deps:data"], prefix = "artifacts", # 设置runfiles中的目标目录名称 visibility = ["//visibility:public"], ) cc_test( name = "my_test", srcs = ["src/test.cc"], data = [":renamed_data"], deps = ["some_deps"], )
这样配置后,原依赖目录下的所有文件会被放置在runfiles的artifacts目录中,完全满足需求且不会触发警告。
方式二:用genrule复制文件(适合无rules_pkg场景)
如果无法使用rules_pkg,可以通过genrule逐个复制文件到指定目录结构,但需要明确列出所有输出文件,避免输出目录:
genrule( name = "data_artifacts", srcs = ["//my/this_is_a_pkg_files_deps:data"], outs = [ "artifacts/file1.txt", "artifacts/file2.bin", # 列出所有需要的文件 ], cmd = "\n".join([ "mkdir -p $(@D)/artifacts", "cp $(location //my/this_is_a_pkg_files_deps:data)/file1.txt $(@D)/artifacts/file1.txt", "cp $(location //my/this_is_a_pkg_files_deps:data)/file2.bin $(@D)/artifacts/file2.bin", ]), ) cc_test( name = "my_test", srcs = ["src/test.cc"], data = [":data_artifacts"], deps = ["some_deps"], )
内容的提问来源于stack exchange,提问作者ABCZ
相关产品推荐
相关产品推荐

