如何拷贝$(bazel info output_base)/external依赖到离线机器复用
Bazel 离线环境复用已拉取第三方依赖操作步骤
你可以按以下流程操作,全程不需要无网机器联网,直接复用已有缓存文件:
- 第一步:有网环境提前拉全所有依赖
在能正常联网编译的机器上,进入项目根目录执行bazel fetch //...,该命令会拉取项目所有构建目标依赖的全部第三方文件,包括所有http_archive定义的依赖,确保没有遗漏。执行完成后可以再跑一次全量build确认没有缺失依赖。 - 第二步:打包需要迁移的缓存文件
执行bazel info output_base拿到当前项目的Bazel输出根路径,该路径下的external目录就是所有第三方依赖的存放位置。同时找到Bazel全局缓存路径(默认是当前用户家目录下的~/.cache/bazel,如果自定义过BAZEL_CACHE环境变量就取对应路径)。用tar命令把这两部分内容打包,注意保留文件权限:tar -zcpf bazel_offline_cache.tar.gz $(bazel info output_base)/external ~/.cache/bazel - 第三步:无网机器部署缓存
- 先在无网机器上安装和有网机器版本完全一致的Bazel,版本不匹配会直接导致缓存哈希校验失败无法复用。
- 把打包好的
bazel_offline_cache.tar.gz传到无网机器,解压到对应路径:- 先在无网机器的项目目录下执行
bazel info output_base拿到无网环境的输出根路径,把解压得到的external目录完整覆盖到该路径下。 - 把解压得到的bazel缓存内容,完整覆盖到无网机器对应用户家目录的
~/.cache/bazel路径,保持原有目录结构不变。
- 先在无网机器的项目目录下执行
- 第四步:离线模式编译
编译时加上离线参数,禁止Bazel发起网络拉取请求:
如果需要长期使用离线配置,可以直接在项目根目录的bazel build //你的构建目标 --offline --nofetch.bazelrc文件中加入以下配置,后续执行bazel命令不需要重复加参数:build --offline --nofetch
注意事项
- 两台机器的操作系统、CPU架构需要保持一致,平台相关的二进制依赖跨架构/跨系统无法正常使用。
- 不要手动修改解压后的缓存文件,Bazel会对依赖做哈希校验,文件被改动后会判定缓存失效,触发拉取逻辑。
- 如果项目中还用到了
git_repository、maven_install等非http_archive的依赖拉取规则,bazel fetch //...命令也会同步拉取对应内容,不需要额外处理。
内容的提问来源于stack exchange,提问作者hustyangsan
相关产品推荐
相关产品推荐

