[特殊字符] 解决 Bazel 在 MediaPipe 项目中报错:“specified in .bazelversion but wasn’t found”

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)

相关推荐
butteringing10 个月前
BuildFarm Worker 简要分析
linux·软件构建·bazel·re api
糖果Autosar1 年前
Writing Bazel rules: library rule, depsets, providers
bazel
糖果Autosar1 年前
Writing Bazel rules: simple binary rule
bazel
m0_740433832 年前
bazel使用中存在的问题
bazel
m0_740433832 年前
bazel远程缓存(Remote Cache)
bazel