本文档描述了在 Apollo 项目中准备 Bazel 的依赖缓存目录 (Distribution Directory, 参考链接) 的方法。
根据Bazel 官方指南:在封闭环境中运行 Bazel 的说明,Bazel 的隐性依赖项是在 Bazel 初次运行的时候从网络上拉取的。然而,即使所有在 WORKSPACE 中指定的依赖项均已到位,这在封闭环境或者网络连接不稳定的状况下依然会造成问题。
为解决这一问题,进一步便利国内开发者,Apollo 团队决定从今日起,对 Apollo 中用到 的所有 Bazel 二进制版本,均提与之对应的 Bazel 隐性依赖压缩包文件。请注意,由于对 不同版本的 Bazel 二进制来说,其隐性依赖项也有可能不同。因此,当 Bazel 二进制版本更新后,请务必重新按照本文档的描述方法,重新执行一次。
在接下来的小节中,我们将会熟悉把 Apollo 提供的压缩包解压到 Bazel 的依赖缓存目录的流程。
- 在 Apollo 容器中执行
bazel version
确定 Bazel 版本:
$ bazel version
Build label: 3.5.0
Build target: bazel-out/aarch64-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
Build time: Wed Sep 2 21:11:43 2020 (1599081103)
Build timestamp: 1599081103
Build timestamp as int: 1599081103
在本示例中的 Bazel 版本为3.5.0
。在以下行文中,我们将以BAZEL_VERSION
指代之。
- 运行如下命令以下载对应的 Bazel 隐性依赖压缩包
wget https://apollo-system.cdn.bcebos.com/archive/bazel_deps/bazel-dependencies-${BAZEL_VERSION}.tar.gz
- 将压缩包解压到由 Apollo 环境变量
${APOLLO_BAZEL_DIST_DIR}
指代的 Bazel 依赖缓存目录
tar xzf bazel-dependencies-${BAZEL_VERSION}.tar.gz
source ${APOLLO_ROOT_DIR}/cyber/setup.bash
mv bazel-dependencies-${BAZEL_VERSION}/* "${APOLLO_BAZEL_DIST_DIR}"
如果您需要的 Bazel 版本 Apollo 未能提供,除了在 GitHub 提交 issue 反馈外, 您还可以通过如下方法在一台网络连接良好的机器上自己动手构建:
# 克隆对应分支的Bazel源码
git clone --depth=1 -b "${BAZEL_VERSION}" https://github.com/bazelbuild/bazel bazel.git
cd bazel.git
# 构建对应的Bazel隐性依赖压缩文件
bazel build @additional_distfiles//:archives.tar
# 确保${APOLLO_BAZEL_DIST_DIR} 变量已定义,且对应的目录存在
source ${APOLLO_ROOT_DIR}/cyber/setup.bash
[[ -d "${APOLLO_BAZEL_DIST_DIR}" ]] || mkdir -p "${APOLLO_BAZEL_DIST_DIR}"
# 将与该Bazel版本对应的各隐性依赖项全部解压到Bazel依赖缓存目录中
tar xvf bazel-bin/external/additional_distfiles/archives.tar \
-C "${APOLLO_BAZEL_DIST_DIR}" --strip-components=3
然后,你就可以在 Apollo 容器中顺利执行./apollo.sh build
,./apollo.sh test
等命令而无需担心依赖项拉不下来的问题了。