使用Bazel http_archive时,如何获取添加的补丁文件?
Bazel http_archive补丁文件路径与定位问题解决
1. 补丁文件路径的错误修正
你写的//@abc/bcd.txt是错误的Bazel路径引用格式:
//开头代表当前仓库的根目录,而@abc是外部仓库的标识,正确引用外部仓库文件的格式是@abc//:bcd.txt(文件在外部仓库根目录);如果文件在子目录,比如abc仓库的docs目录下,路径应为@abc//docs:bcd.txt。
修正后的http_archive配置:
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") http_archive( name="some-lib", build_file="@my-project//some-lib:BUILD.some-lib", url="https://example/download/some-lib.tar.gz", sha256="x", patches=[ "@abc//:bcd.txt", ], )
2. 补丁文件的位置定位
- 如果
@abc是你本地通过local_repository导入的仓库,bcd.txt需要放在abc仓库的根目录(对应@abc//:bcd.txt),或者对应子目录下(如果用了子路径)。 - 如果
@abc是通过http_archive/git_repository导入的外部仓库,要确保该仓库中确实存在bcd.txt文件,路径和你引用的一致。 - 可以用Bazel命令验证文件是否存在:
命令能返回文件路径说明引用正确,报错则说明路径或文件不存在。bazel query @abc//:bcd.txt
3. 补丁生效后的文件位置
当补丁成功应用后,文件会被添加到some-lib仓库的解压目录中,你可以在Bazel缓存目录找到这个位置:
- 路径一般为:
$HOME/.cache/bazel/_bazel_<你的用户名>/<随机哈希值>/external/some-lib - 进入该目录就能看到补丁添加的文件,和
patch_cmds生成的efg.txt在同一层级。
4. 关于patch_cmds的说明
patch_cmds是在http_archive解压后的仓库目录中直接执行shell命令,所以生成的efg.txt直接出现在该目录下。而补丁文件需要先被Bazel正确定位,再应用到这个目录,所以核心问题是先修正补丁文件的引用路径。
内容的提问来源于stack exchange,提问作者Molly Tian
相关产品推荐
相关产品推荐

