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

如何将Bazel filegroup的所有文件打包到目录并生成新目标?

解决方法

方案1:使用rules_pkg的pkg_directory规则(推荐)

rules_pkg是Bazel官方打包规则集,能便捷地将文件按原有目录结构打包到指定根目录下。

  1. 在WORKSPACE文件中添加rules_pkg依赖(若未添加):
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "rules_pkg",
    urls = ["https://github.com/bazelbuild/rules_pkg/releases/download/0.10.0/rules_pkg-0.10.0.tar.gz"],
    sha256 = "50e6989471a76e37f558b381344a4d9930f54a10777e8b6f45f49d1a2cd67fc4",
)

load("@rules_pkg//:deps.bzl", "rules_pkg_dependencies")

rules_pkg_dependencies()
  1. 在test-data/BUILD.bazel中添加pkg_directory目标:
load("@rules_pkg//:pkg.bzl", "pkg_directory")

filegroup(
    name = "render-test-files",
    srcs = glob([
        "integration/**",
        "tests/**",
        "linux-gcc8-release/**",
        "expectations/platform-all/**",
        "ignores/**",
    ], allow_empty = False),
    visibility = [
        "//render-test:__subpackages__",
    ],
)

pkg_directory(
    name = "render-test-data-dir",
    srcs = [":render-test-files"],
    package_dir = "test-data",  # 指定输出的根目录名称
    visibility = ["//render-test:__subpackages__"],
)

该目标会将render-test-files中的所有文件,保留原有相对目录结构,打包到test-data目录下,测试运行器可直接依赖//test-data:render-test-data-dir。

方案2:使用genrule配合$(locations)变量

若不想引入额外依赖,可通过$(locations)变量自动获取输入文件路径,避免手动列出所有输出:

在test-data/BUILD.bazel中添加:

filegroup(
    name = "render-test-files",
    srcs = glob([
        "integration/**",
        "tests/**",
        "linux-gcc8-release/**",
        "expectations/platform-all/**",
        "ignores/**",
    ], allow_empty = False),
    visibility = [
        "//render-test:__subpackages__",
    ],
)

genrule(
    name = "render-test-data-dir",
    srcs = [":render-test-files"],
    # 注意:需Bazel 5.0+版本支持declare_directory特性
    outs = [":test-data"],
    cmd = """
        # 创建输出目录下的test-data子目录
        mkdir -p $@/test-data
        # 遍历所有输入文件,复制到目标目录并保留相对路径
        for file in $(locations :render-test-files); do
            # 去除原路径中的test-data前缀,保留剩余相对路径
            relative_path=$(echo "$$file" | sed 's|^test-data/||')
            dest_dir="$@/test-data/$(dirname "$$relative_path")"
            mkdir -p "$$dest_dir"
            cp -R "$$file" "$$dest_dir"
        done
    """,
    visibility = ["//render-test:__subpackages__"],
)

此genrule会将所有输入文件复制到输出目录的test-data子目录下,保持原有的文件层级结构。

内容的提问来源于stack exchange,提问作者Bart Louwers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:23:07