多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Homebrew 装不上?BrewUI 图形化管理实战:从镜像安装到卸载残留

Homebrew 装不上?BrewUI 图形化管理实战:从镜像安装到卸载残留 上个月帮同事处理一台老旧 Intel Mac 上的 Homebrew 问题时他靠在椅背上问我“这东西有没有图形界面我不想记住那些 update、upgrade 的命令就想知道哪个软件能更新、点了就完事。”我当时正对着/usr/local目录里散落的 Cellar 残留一边清理一边想确实Homebrew 对新手最大的门槛不是它不好用而是“好不好用”这件事被命令行这位翻译官挡得死死的。BrewUI 就是为解决这个场景出现的。它不是 Homebrew 的替代品而是给 Homebrew 加了一层桌面图形界面让你能浏览已安装的软件包、查看更新、执行升级和清理甚至搜索并安装新的工具和图形应用。对于那些“能用电脑但不想背命令行”的朋友BrewUI 直接把 Homebrew 变成一排排看得见、点得动的按钮。当然它也救不了那些连 Homebrew 本身都没装上的机器——所以我这篇会从 Homebrew 安装报错开始讲再到 Intel Mac 装不上的原因分析然后是 BrewUI 的安装、日常操作、终端互补最后专门把卸载残留这件事说透。这篇文章适合所有想在 macOS 上省心管理软件的人尤其是被安装错误劝退过、或者刚接触 Homebrew 的同学。1. 好端端的命令行工具为什么我要给 Homebrew 套一层 UI1.1 一屏命令和一屏列表之间的差距Homebrew 本身的设计逻辑是优秀的你用它安装开源工具、编译软件、管理依赖一条brew install能帮你处理把下载、解压、配置环境变量、建立符号链接等一系列工作。但逻辑优秀不代表交互友好。要在终端里搞清楚“我到底装了哪些东西”你得敲brew list想知道哪些能更新得敲brew outdated想升级得敲brew upgrade想搜索得敲brew search。这还没算各种参数、依赖树、cask 和 formula 的区别、以及偶尔冒出来的警告信息。能记住这些命令并不是难事但很多人使用电脑的诉求根本不在“记住命令”上。他们想用 Visual Studio Code、想装 Chrome、想装 FFmpegHomebrew 只是他们达成目的的工具。用命令行的方式管理命令行工具本身就是一种重复劳动。而 BrewUI 把所有东西放进一个窗口分栏显示软件包列表、版本状态、更新情况用鼠标就能完成大部分操作。对于日常管理频率不高的普通人这种转换带来的体验提升是显著的。1.2 BrewUI 到底能做什么又不管什么在动手安装之前先把 BrewUI 的能力边界说清楚避免你装完以后期望落空。BrewUI 能做的事我用一张表列出来功能模块具体能力对应终端命令软件包浏览查看已安装的 formula、cask 和依赖关系brew list、brew deps更新检查区分可更新项显示旧版本号和新版本号brew outdated执行升级一键升级所有或指定软件brew upgrade搜索安装按关键字搜索远程索引点击安装brew search、brew install卸载管理卸载指定 formula 或 caskbrew uninstall清理缓存清除旧版本压缩包和日志brew cleanupBrewUI 不管的事也得心里有数它不负责帮你搞定 Homebrew 的安装过程也代替不了终端在排查问题时的作用。如果你遇到的是依赖冲突、编译失败、权限异常大概率还是要回到终端看日志。GUI 工具负责的是“日常操作”不是“疑难杂症诊断”。2. 卡在安装那一步先弄清楚 Homebrew 装不上的真实原因2.1 网络报错不等于不能装先分类再对症很多拿到新 Mac 或者重装系统后的朋友都会卡在同一个位置安装 Homebrew。最常见的报错是执行官方安装命令时提示连接失败、超时或者curl: (7) Failed to connect。看到这类报错先别慌这大概率不是你的操作问题而是安装脚本默认要从 GitHub 拉取资源而资源地址在你的网络环境下响应很慢或直接被切断。这类问题有一个合法的常规解法使用国内高校提供的 Homebrew 镜像源。具体操作我在 2.3 节给完整步骤。这里先告诉你排查顺序先看网络错误再看系统版本最后看架构。依次排除之后你基本能定位 80% 的安装失败原因。还有一个很容易被忽略的原因安全软件或 macOS 的 Gatekeeper 拦截。如果安装脚本是从网页上下载后通过终端执行的可能触发权限提示。你要检查的是“系统设置—隐私与安全性”里有没有被拦截的记录有的话点允许。2.2 Intel Mac 和 Apple Silicon路径与系统版本的红线网上经常看到一条热词叫“intel mac 安装不了 homebrew 了”有人以为 Homebrew 放弃 Intel 了其实不完全是。Homebrew 至今仍然支持 Intel 架构只是安装路径和 Apple Silicon 不一样。Intel Mac 的 Homebrew 跑在/usr/localApple Silicon 跑在/opt/homebrew。如果你在一台 Intel Mac 上强行按照 Apple Silicon 的教程设置环境变量肯定装不好。更常见的问题是系统版本太老。Homebrew 的安装脚本对 macOS 版本有最低要求比如较新的 Homebrew 版本要求 macOS Monterey12.3及以上。一些 2015 年前后的 Intel Mac系统停留在 Catalina 或 Big Sur运行安装脚本时会直接因为缺少新版本依赖而退出。遇到这种情况先升级系统再装 Homebrew。如果机器确实升不了级可以考虑安装旧版本 Homebrew或者改用其他包管理方案。这不叫“Intel 不能装”这叫“系统太老不能装”。我还见过有人搞混 Rosetta 和 Intel 的关系。Apple Silicon 机器上通过 Rosetta 2 运行 Intel 版 Homebrew 是另一种玩法但对绝大多数人来说没必要。你用哪台机器就装对应架构的 Homebrew别为了“兼容性”去折腾另一种架构给自己增加不必要的维护成本。2.3 用国内镜像源完成安装的具体步骤下面给一套我实测过的流程。这套流程能解决大部分“下载失败”导致的报错。需要注意执行这些命令前请确认你的 shell 是 zshmacOS 默认。先把镜像源环境变量写入配置文件echo export HOMEBREW_BREW_GIT_REMOTEhttps://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git ~/.zshrc echo export HOMEBREW_CORE_GIT_REMOTEhttps://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git ~/.zshrc echo export HOMEBREW_BOTTLE_DOMAINhttps://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles ~/.zshrc source ~/.zshrc然后下载安装脚本并执行curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh -o install.sh这里如果在下载脚本这一步就卡住可以把命令中的网址换成镜像站点提供的脚本副本或者用浏览器手动访问下载安装脚本文件再在终端中执行本地文件/bin/bash install.sh安装过程中脚本会提示你选择使用的镜像源因为我刚才已经设置了环境变量脚本会优先走清华源。整个安装大约需要几分钟取决于网络状况和机器性能。装完之后验证brew --version如果输出了版本号说明 Homebrew 已经正常安装。注意 Intel 和 Apple Silicon 的验证有一点差异Intel Mac 上执行which brew结果应该是/usr/local/bin/brewApple Silicon 上应该是/opt/homebrew/bin/brew。如果你的结果不是这样后面 BrewUI 可能找不到 brew 命令。提示如果你以前设置过其他镜像源先把配置文件里相关的行删掉再写入新的避免新旧源混在一起导致 git 拉取时出现奇怪的分支错乱。2.4 我见过的最隐蔽的安装失败原因有一个问题非常隐蔽Homebrew 安装完成后找不到命令。很多人以为安装失败其实 Homebrew 已经装好了只是 shell 环境变量没有配置完整。Intel Mac 上需要在~/.zshrc中包含/usr/local/binApple Silicon 上需要添加/opt/homebrew/bin。在一些非标准终端模拟器或者通过 SSH 登录的场景下配置文件加载顺序不同也可能导致 brew 命令无法识别。这时候检查配置文件的顺序以及是否调用了eval $(/opt/homebrew/bin/brew shellenv)就能解决。3. BrewUI 的安装、授权与界面认知3.1 安装 BrewUI 的两种方式说完了 Homebrew 本身终于到主角。BrewUI 的安装不复杂甚至如果你已经把 Homebrew 装好了那它就是一条命令的事。推荐方式是通过 Homebrew 本身安装这样以后删除和升级都会自动纳入管理brew install --cask brewui如果你更想直接从项目仓库拿最新版去 BrewUI 的 GitHub Releases 页面下载对应的 dmg 文件拖拽到 Applications 文件夹也可以。两种方式我都用过从后期维护的角度我推荐前者。原因很简单用 Homebrew 管理 BrewUI 之后BrewUI 的更新会出现在 Homebrew 的升级列表里你不用单独跑一趟应用商店。安装完成以后打开启动台找到 BrewUI 的应用图标。如果你是第一次打开macOS 可能会提示“无法验证开发者”之类的拦截信息。这是因为它是开源项目没有走 App Store 的签名认证流程。解决办法是到“系统设置—隐私与安全性”里点一下“仍要打开”属于正常操作。3.2 首次启动的授权为什么 BrewUI 要访问终端第一次启动 BrewUI它会请求“完全磁盘访问权限”或者“访问终端”的授权。这个授权对很多人来说有点吓人“一个管理软件包的界面凭什么要这么高权限”原因是 BrewUI 本质上是执行 Homebrew 的命令来完成任务。它需要读取你系统里已经安装的软件信息、写入安装目录、创建符号链接。这些操作都需要访问 Homebrew 所在的目录而 macOS 的安全机制把终端和目录访问分得很细。没有授权的话BrewUI 就只能“看”不能“动”。这个授权是合理的你只要确认是从官方渠道下载的 BrewUI就可以放心授予。拒绝授权的后果就是软件列表空白、点击操作报权限错误。3.3 认识 BrewUI 的主界面BrewUI 的界面不复杂它把 Homebrew 的概念翻译成了图形元素。我建议第一次打开后先花一分钟把各个区域对应起来界面区域呈现内容对应 Homebrew 概念左侧分类栏已安装项、可更新项、全部表单brew list、brew outdated、brew search中间列表区软件包名称、版本号、来源brew list --versions右侧详情区软件描述、依赖关系、安装路径brew info、brew deps顶部操作栏刷新、更新全部、清理缓存brew update、brew upgrade、brew cleanup界面词汇你可能一开始不太习惯。“Formulae” 通常指命令行工具比如 git、python、wget“Casks” 指带图形界面的应用比如 Chrome、Visual Studio Code。这个区分是 Homebrew 的核心概念理解之后你看列表就不会一头雾水。BrewUI 在列表里会把两者用标签区分开。4. 日常用得最多的几个功能更新、升级、搜索、清理4.1 查看更新并安全升级BrewUI 打开以后那个“可更新项”的分类栏是最值得关注的。它会列出所有有新版本的软件包左边显示当前版本右边显示可升级到的版本一眼就能看出哪些是重要更新。操作上你既可以选择单个软件包点升级也可以点顶部的“全部更新”一键处理。但这里我必须提醒一句不要盲目点“全部更新”。Homebrew 的大版本升级有时候会带着依赖环境一起升级比如 Python、Ruby 这类被大量软件依赖的基础组件升级之后可能导致其他程序出现兼容性问题。我在实际使用中吃过亏有一次升级了依赖库之后本地开发的 Python 虚拟环境因为 C 扩展库版本不匹配直接无法导入。所以比较稳妥的做法是先在 BrewUI 里看更新列表对不确定的软件包点进详情看版本变化如果是 1.x 升 2.x 这种大版本跳变先看看更新日志或者去项目主页确认兼容性再动手升级。4.2 搜索并安装软件包的完整流程BrewUI 的搜索框放在界面顶部。输入关键字之后它会即时展示匹配的 formula 和 cask。比如你输入 ffmpeg会看到一个命令行工具的条目输入 chrome会看到一个 cask 应用的条目。点击需要的条目右侧详情区会显示简介、版本号、依赖关系、安装路径等信息。确认无误后点安装按钮BrewUI 会列出即将执行的 brew 命令并开始执行。这个过程你可以看到命令输出的实时日志它本质上还是 Homebrew 在干活只是不需要你手动输入命令了。安装完成后已安装列表会刷新新装的应用或工具即刻可见。这里有个小技巧搜索时如果同时看到了 formula 和 cask 两个同名条目大部分情况下你需要的是 cask 版本因为带图形界面的应用通常以 cask 形式发布。命令行工具才用 formula。不确定的时候看详情区的描述里有没有 “GUI application” 字样就明白了。4.3 卸载与清理为什么不要直接删 App大多数人卸载软件的习惯是把它从“应用程序”文件夹直接拖进废纸篓。这个方法对 App Store 应用没问题对通过 Homebrew cask 安装的应用却不干净。因为 cask 安装的应用它的元数据、缓存、依赖关系都还留在 Homebrew 的数据库里。直接拖拽删除后Homebrew 仍然认为这个软件还装着下次brew upgrade的时候它会尝试重新装回来——别问我怎么知道的。在 BrewUI 里卸载和清理是一个完整的闭环。卸载某个 cask 或 formula 时它会执行brew uninstall把这个软件从 Homebrew 的跟踪表里移除同时清理符号链接。之后再运行清理功能把过期的缓存压缩包删除。整个流程下来磁盘上不会残留一堆不知道是谁的孤立文件。4.4 缓存清理的时机清理缓存是一项容易被忽视但很有用的操作。Homebrew 在安装软件时会把下载的压缩包缓存在本地目录时间一长这个目录可能会积累几个 GB 的垃圾。BrewUI 的清理功能相当于brew cleanup会把旧版本的压缩包清理掉。我的建议是每两到三周清理一次或者在你确认所有软件都已经升级到最新版之后清理。如果清理频率太低缓存目录会膨胀如果清理频率太高下次重新安装某个软件时又得重新下载反而是时间浪费。5. GUI 做不了的事我还是得回终端补几刀5.1 复杂依赖和调试信息终端反而更直观BrewUI 能覆盖大部分日常场景但有两个场景我建议你用终端。第一个是排查安装失败原因。BrewUI 的日志窗口会显示命令输出但它是运行完才汇总的遇到中途卡住的情况还是直接在终端里执行一遍brew install xxx来得直接你能看到实时的下载进度和失败位置。第二个场景是查看依赖树。某个软件装不上去很可能是依赖的库版本冲突用brew deps --tree这种命令查看依赖层级比在 GUI 界面点来点去高效得多。5.2 和 BrewUI 搭配的高频命令清单这里推荐几条和 BrewUI 配合使用的高频命令遇到 GUI 力不从心的场景直接复制# 查看安装时出现过问题的软件 brew doctor # 以树状结构查看某个软件的依赖 brew deps --tree wget # 查看后台服务状态数据库、Web 服务器类 brew services list # 查看某个软件的具体安装路径和版本 brew list --versions pythonbrew doctor是最值得养成习惯的一条命令。它相当于 Homebrew 的自检程序能告诉你哪些安装环境有不正常、哪些符号链接断了、哪些目录权限有问题。我一般每月跑一次在 BrewUI 里看更新之前也会跑一遍确保基础环境是健康的。GUI 界面把大部分操作简化了但环境健康体检还得靠终端。5.3 GUI 与终端的协同节奏我的日常节奏是终端跑brew doctor检查环境 → 打开 BrewUI 看可更新列表 → 在 BrewUI 里选择性地升级 → 偶尔用终端查依赖树确认某个软件升级带来的影响面 → 最后再回到 BrewUI 做清理。这个流程兼顾了效率和安全。BrewUI 不是让我彻底告别终端它让我把精力集中在真正需要命令行的场景而不是在“查一下哪个软件需要升级”这种琐事上浪费注意力。6. 卸载残留是最容易被忽视的坑我专门说透6.1 官方卸载脚本的局限“homebrew 卸载残留”这个热词排在搜索榜上不是没有原因的。很多人想卸载 Homebrew只是因为装的时候出了问题或者电脑上已经有过一个残缺的老版本。执行官方卸载脚本/bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)脚本能帮你删除 Homebrew 的主程序、Cellar、Caskroom 等目录但它不会处理你在 shell 配置文件里写入的环境变量也不一定会清理用户缓存目录和日志目录。如果你只是跑了卸载脚本就以为干净了下一次安装时很可能因为这些残留导致新老配置冲突表现为“刚装完 Homebrew运行 brew 命令却提示找不到或者提示目录已被占用”。6.2 需要手动检查的路径清单卸载 Homebrew 之后照着下面这张表手动复查一遍才能算真正干净路径说明是否存在/usr/local/Homebrew或/opt/homebrewHomebrew 主目录检查并删除/usr/local/Cellar、/usr/local/Caskroom软件包安装目录检查并删除/usr/local/bin、/usr/local/share、/usr/local/etc相关符号链接和配置文件按需检查~/Library/Caches/Homebrew下载缓存检查并删除~/Library/Logs/Homebrew安装日志检查并删除~/.zshrc、~/.zprofile中的 Homebrew 配置环境变量、镜像源设置删除对应行检查完成后还需要把 shell 配置里涉及 Homebrew 的环境变量行删掉。常见的是eval $(/opt/homebrew/bin/brew shellenv)或者export PATH/usr/local/bin:/usr/local/sbin:$PATH删除之后重新打开终端执行which brew如果没有输出任何路径说明命令层面的残留已经清除。6.3 残留清理后重装一套干净 Homebrew 的完整流程清理结束不代表任务完成很多人清完就直接跑官方安装命令结果又在旧问题的坑里兜圈。我建议按照固定的顺序重装。先再次确认没有brew命令残留然后重新设置镜像源环境变量再执行安装脚本。整个流程是# 1. 确认命令行没有 brew which brew # 2. 重新写入镜像源配置 echo export HOMEBREW_BREW_GIT_REMOTEhttps://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git ~/.zshrc echo export HOMEBREW_CORE_GIT_REMOTEhttps://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git ~/.zshrc echo export HOMEBREW_BOTTLE_DOMAINhttps://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles ~/.zshrc source ~/.zshrc # 3. 重新安装 /bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)装完后再做一次基础运行验证“brew --version” 和 “brew doctor”。如果两者都正常再打开 BrewUI这时候你会得到一个干净、清爽的管理界面而不是带着历史包袱的旧仓库。注意如果你的主要目的是“重新安装干净的 Homebrew”不要在清理完和重装之前把老的安装目录直接建回来也不要手动创建 /opt/homebrew 或 /usr/local/Homebrew 目录让安装脚本自己处理否则容易出现权限错乱。7. 关于 BrewUI 的几条实用经验与配置建议7.1 什么时候只能用 GUI什么时候必须回终端我用 BrewUI 一段时间之后最大的感受是“凡是有明确按钮的操作用 GUI 都比终端稳妥”。因为按钮背后是固定的、经过验证的命令不容易出现手误。以前在终端里执行brew upgrade偶尔会不小心多输入一个参数现在这个失误被 BrewUI 消灭了。但真正需要精细控制的时候终端还是不可替代。比如你只想升级某个软件的不再安装不兼容的其他软件该怎么办这时候 BrewUI 的命令模式或者直接回终端执行带参数的命令更合适。很多 GUI 工具在新手期给人“什么都能点”的错觉其实它的设计哲学是“把常见操作做到极致简单”并不试图覆盖所有命令行参数。理解这一点你就知道什么场景该用哪个工具了。7.2 我个人的配置建议把 BrewUI 当成管理入口把终端当成体检中心我现在的固定配置是BrewUI 负责查看、安装、升级、清理这些日常管理动作终端负责环境自检和复杂依赖排查。这样划分之后我维护 macOS 开发环境的精力开销降了非常多。以前每两周要花半小时在各个命令行之间来回折腾现在是打开 BrewUI 扫一眼更新情况再花两分钟跑个brew doctor完事。如果你家里有一台 Intel 老 Mac还想继续用 Homebrew 管理软件我建议你先把系统升级到官方支持的新版本再按照本文第 2 节的方法设置镜像源装好 Homebrew 后再用 BrewUI 管理日常更新。不要因为网上那句话“Intel Mac 装不了 Homebrew”就觉得只能放弃。很多时候不是装不了是安装姿势不对或者系统版本不够新。只要绕开这些坑老机器依然可以活得挺好。最后再分享一个我个人的小习惯在升级重要软件之前我会先在 BrewUI 里把对应软件包的信息页面打开确认它的依赖变化再去终端执行brew deps --tree 软件名看一遍依赖树。这样升级是主动的、有预期的而不是闭着眼睛等结果。这个动作看似多花了两分钟但它帮我躲过了好几次依赖冲突的雷。折腾 Homebrew 这么多年我最大的经验就是六个字慢一点稳一点。
返回列表