如何将Bazel filegroup的所有文件打包到目录并生成新目标?
解决方法
方案1:使用rules_pkg的pkg_directory规则(推荐)
rules_pkg是Bazel官方打包规则集,能便捷地将文件按原有目录结构打包到指定根目录下。
- 在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()
- 在
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
相关产品推荐
相关产品推荐

