MediaPipe 配置 Bazel 7.4.1 过程中的坑和解决办法。
在尝试构建 MediaPipe 时,运行:
bazel --version
却得到错误:
(specified in .bazelversion), but it wasn't found in ~/.bazel/bin
这种情况不是 MediaPipe 的错误,而是 Bazel 版本管理机制导致的错误 。(Stack Overflow)
📌 1. 这是怎么回事?
MediaPipe 的工程根目录含有一个 .bazelversion 文件(例如写着 7.4.1)。
当你运行 bazel 命令时:
-
Bazel(或 Bazel wrapper)会尝试去
~/.bazel/bin/找一个与.bazelversion匹配的 Bazel 二进制。 -
如果找不到,就会抛出上述错误,即使你已经安装了 Bazel 本体在
/usr/local/bin或~/bin下。(Stack Overflow)
这背后是 Bazel 版本管理或自动版本选择工具(如 Bazelisk)默认行为的一部分。
📌 2. 问题关键
在你的系统中:
which bazel
显示:
/home/slt/bin/bazel
并且这个路径下的 bazel 其实是一个 wrapper/shim 脚本 ,而不是 Bazel 本体。这个脚本会强制查找 ~/.bazel/bin 中的匹配版本,而不是直接运行你手动安装的 bazel binary(例如放在 /usr/local/bin)。最终导致了重复的 "Bazel not found" 报错。
📌 3. 完整解决方案(步骤详解)
✅ 3.1 删除旧的 shim/wrapper
删除旧的 Bazel 版本管理脚本(非常关键,否则系统会继续拦截 bazel 命令):
rm -rf ~/.bazel
这样可以清除老的 Bazel 缓存和 wrapper,包括 ~/.bazel/bin/bazel。
✅ 3.2 手动下载 Bazel 7.4.1 二进制
从 Bazel 官方 releases 页面下载对应版本:
wget https://releases.bazel.build/7.4.1/release/bazel-7.4.1-linux-x86_64
chmod +x bazel-7.4.1-linux-x86_64
sudo mv bazel-7.4.1-linux-x86_64 /usr/local/bin/bazel-7.4.1
✅ 3.3 将正确版本的 Bazel 设为系统默认
创建软链接覆盖 bazel 命令:
sudo ln -sf /usr/local/bin/bazel-7.4.1 /usr/local/bin/bazel
确保 PATH 环境变量优先查找 /usr/local/bin:
echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
这里将
/usr/local/bin优先放到 PATH 里保持bazel指向你手动安装的位置,而不是其他缓存目录。
✅ 3.4 验证安装
which bazel
# 应该是 /usr/local/bin/bazel
bazel --version
# 应该是 bazel 7.4.1
如果输出正确版本,就说明 Bazel 已经按预期安装。
📌 4. 为什么这种错误会发生?
这是因为 Bazel 生态中有像 Bazelisk 这样的工具(官方推荐的版本管理器),它会:
-
自动读取
.bazelversion、.bazeliskrc或环境变量; -
并尝试在缓存目录下载对应版本;
-
若找不到就报错,而不会直接执行路径里的 Bazel 二进制。(Stack Overflow)
在你的情况里,由于残留的 wrapper 脚本 (~/.bazel/bin/bazel) 有优先权,因此导致了这种版本查找失败的结果。
📌 5. 如果想用 Bazelisk 而不是手动安装?
Bazelisk 能根据 .bazelversion 自动下载和管理 Bazel 版本,理论上是推荐方式:
wget https://github.com/bazelbuild/bazelisk/releases/latest/download/bazelisk-linux-amd64
chmod +x bazelisk-linux-amd64
sudo mv bazelisk-linux-amd64 /usr/local/bin/bazel
然后运行:
bazel version
Bazelisk 会自动下载 Bazel 7.4.1 并执行。
📌 6. 结语
✔️ 这次错误并不是 MediaPipe 的构建逻辑问题,而是 Bazel 自身的版本查找机制导致的配置冲突。
✔️ 解决思路是:确保 Bazel 的调用指向正确可执行文件,并避免旧的版本管理脚本干扰执行流程 。
✔️ 最稳妥的办法是手动管理好你指定版本的 Bazel 二进制或使用 Bazelisk 自动管理。(Stack Overflow)