如何通过Bazel pkg_files将Subfolder1生成的文件打包至SubSubfolder2?
Bazel跨目录打包生成文件解决方案
项目结构说明
你的Bazel项目当前目录结构如下:
MainFolder | ├── Folder1 │ └── Subfolder1 │ ├── BUILD │ └── WORKSPACE ├── Folder2 │ └── Subfolder2 │ └── SubSubfolder2 │ ├── BUILD │ └── WORKSPACE
问题核心
需要将Subfolder1中BUILD规则生成的文件,打包到SubSubfolder2的pkg_files目标中,添加根目录WORKSPACE后未解决问题,且不清楚pkg_files的prefix参数如何配置。
解决步骤
1. 统一WORKSPACE配置
Bazel项目仅允许存在一个根WORKSPACE文件,子目录中的WORKSPACE会将该目录隔离为独立仓库,导致跨目录无法引用生成文件:
- 删除Folder1/Subfolder1和Folder2/Subfolder2/SubSubfolder2下的WORKSPACE文件
- 在MainFolder根目录创建唯一的WORKSPACE文件(如果尚未创建)
2. 确保Subfolder1的生成文件可被引用
在Folder1/Subfolder1/BUILD中,确保生成文件的规则(比如genrule)正确声明输出文件,示例:
genrule( name = "my_generated_files", outs = ["file_a.txt", "file_b.json"], cmd = "echo 'sample content' > $@", # 替换为你的实际生成命令 )
3. 在SubSubfolder2中配置pkg_files
在Folder2/Subfolder2/SubSubfolder2/BUILD中,通过完整Bazel标签引用Subfolder1的生成文件,并配置prefix参数:
# 先导入rules_pkg规则 load("@rules_pkg//pkg:pkg.bzl", "pkg_files") pkg_files( name = "packaged_target", srcs = [ # 方式1:直接引用单个生成文件 "//Folder1/Subfolder1:file_a.txt", "//Folder1/Subfolder1:file_b.json", # 方式2:引用整个生成规则目标,一次性打包所有输出文件 "//Folder1/Subfolder1:my_generated_files", ], # prefix参数说明: # - 填"":生成文件会放在打包结果的根目录 # - 填"Subfolder2/SubSubfolder2":生成文件会放在打包结果的对应子目录下 # 根据你的需求选择对应路径 prefix = "Subfolder2/SubSubfolder2", )
4. 执行打包命令
在MainFolder根目录下运行:
bazel build //Folder2/Subfolder2/SubSubfolder2:packaged_target
生成的打包产物会位于bazel-bin/Folder2/Subfolder2/SubSubfolder2/目录下。
关键注意点
- 标签路径必须正确:Bazel的标签格式为
//目录路径:目标名,确保引用的生成文件或规则存在 - rules_pkg依赖:如果项目中未引入rules_pkg,需要在根WORKSPACE中添加对应的依赖配置(比如通过
http_archive)
内容的提问来源于stack exchange,提问作者falco
相关产品推荐
相关产品推荐

