You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 11:37:47