最近在macOS Sonoma(14.x)系统上使用Homebrew时,不少用户遇到了一个棘手的报错:unknown or unsupported macOS version: :dunno。这个错误通常在执行brew update或安装软件时突然出现,导致所有brew命令都无法正常执行。
从技术角度来看,这个问题的根源在于Homebrew的核心仓库(homebrew-core)中的Ruby代码无法正确识别Sonoma系统的版本标识符。在旧版Homebrew中,MacOS.version会被映射为特定的符号(如:ventura、:monterey),但Sonoma系统刚发布时,这个枚举列表中还没有加入对应的标识符,导致系统返回了一个占位符:dunno,从而触发了版本校验失败。
错误日志中显示的具体报错信息是:
code复制/usr/local/Homebrew/Library/Homebrew/os/mac/version.rb:41:in `initialize': unknown or unsupported macOS version: "26.3" (MacOSVersionError)
这个"26.3"实际上是Sonoma系统的内部版本号表示方式,但Homebrew无法正确解析它。值得注意的是,这个错误发生时通常不会伴随明显的网络或权限问题,很容易被误判为系统兼容性问题。
经过对多个案例的分析,我发现这个问题通常由以下几种情况引发:
最普遍的原因是Homebrew本身没有升级到v4.1.0及以上版本。Homebrew在2023年9月才开始正式支持macOS Sonoma系统。如果你是在这个时间点之前安装的Homebrew,或者很久没有执行过brew update,就很可能遇到这个问题。
有些用户可能无意中设置了HOMEBREW_DEVELOPER=1环境变量。这个变量本意是给Homebrew开发者使用的,它会启用一些实验性功能,包括更严格的版本检查。在Sonoma系统刚发布时,这个设置反而会导致问题。
如果你是通过非官方镜像安装的Homebrew,或者添加了一些未及时同步的第三方tap(软件源),也可能导致版本识别问题。特别是那些fork了homebrew-core但没有及时更新的镜像源。
最简单的解决方法是执行以下命令:
bash复制brew update-reset
这个命令会强制重置Homebrew的所有本地仓库,包括homebrew-core和homebrew-cask等。它会丢弃所有本地修改,并从远程仓库重新拉取最新代码。
如果你在执行brew update-reset时遇到网络问题,或者命令执行非常缓慢,建议先更换为国内镜像源。以下是具体步骤:
bash复制cd "$(brew --repo)"
git remote set-url origin https://mirrors.ustc.edu.cn/brew.git
bash复制cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git
bash复制cd "$(brew --repo)/Library/Taps/homebrew/homebrew-cask"
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-cask.git
bash复制echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.zshrc
source ~/.zshrc
注意:如果你使用的是bash而不是zsh,需要将上面的
.zshrc改为.bash_profile或.bashrc。
更换镜像源后,再次执行重置命令:
bash复制brew update-reset
最后,通过以下命令验证问题是否已解决:
bash复制brew --version
brew doctor
如果brew doctor没有报告严重错误,且brew --version显示的版本号较新(v4.1.0以上),说明问题已经解决。
如果命令似乎卡住了,可以尝试以下步骤:
如果更换镜像源后问题依旧,可能是以下原因:
bash复制brew cleanup -s
rm -rf $(brew --cache)
执行以下命令查看Homebrew版本:
bash复制brew --version
支持Sonoma的最低版本是4.1.0。如果你的版本低于这个,需要先升级:
bash复制brew update
如果brew update本身也报错,可以尝试强制重新安装Homebrew。
为了避免将来再次遇到类似问题,我建议采取以下预防措施:
brew update保持Homebrew更新bash复制brew autoupdate start
对于开发者来说,还可以考虑使用brew bundle来管理所有依赖,这样可以更容易地在不同机器间保持环境一致。
对于想更深入了解这个问题的读者,这里提供一些技术背景:
Homebrew使用Ruby编写,其macOS版本检测逻辑主要在/usr/local/Homebrew/Library/Homebrew/os/mac/version.rb文件中实现。当系统版本无法识别时,它会尝试将版本号转换为符号,如果找不到匹配项,就会返回:dunno。
在Sonoma系统刚发布时,Homebrew的代码中还没有添加对应的版本映射。这个问题在Homebrew 4.1.0中得到了修复,新增了如下映射:
ruby复制when "23" then :sonoma
这也是为什么升级到最新版Homebrew能解决这个问题的原因。
如果上述方法都无法解决问题,还可以考虑以下备选方案:
完全卸载并重新安装Homebrew:
bash复制/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
使用Homebrew的本地开发模式临时绕过版本检查(仅限紧急情况):
bash复制export HOMEBREW_DEVELOPER=1
export HOMEBREW_NO_AUTO_UPDATE=1
brew your-command
手动修改版本检测代码(不推荐,除非你非常清楚自己在做什么)
在实际操作中,我发现第一种方法(brew update-reset配合镜像源更换)在90%的情况下都能解决问题。只有在极少数情况下才需要完全重装Homebrew。