
1. 从终端焦虑到图形界面我为什么开始用 BrewUI先说个挺真实的使用场景。用过 Homebrew 的朋友应该都有过这种感觉brew upgrade一跑起来终端里刷屏一样的下载进度、依赖编译输出、各种 Warning 和 Error 堆在一起眼睛根本不知道该看哪一行。运气好几十秒结束运气不好卡在某个依赖上一挂就是半小时还不敢直接 CtrlC怕把包管理器的状态搞坏。尤其是一台主力开发机装了上百个 formulae 和 cask 之后Homebrew 的日常维护已经从顺手敲个命令变成了一种心理负担。BrewUI 就是我在这种背景下开始用的一个开源图形界面工具。简单来说它是 Homebrew 的一个可视化前端把原本要在终端里敲的命令变成了界面上的按钮和列表。安装的包、可更新的包、残留的旧版本、失效的依赖关系一眼就能看到全貌不用再靠记忆去猜我到底装了什么。这个项目特别适合两类人。第一类是刚接触 macOS 开发环境、对终端天然有距离感的新手图形界面的信息呈现方式比命令行输出友好得多第二类是装了非常多包的老手需要频繁做批量升级和清理用 BrewUI 能把那些重复性的、容易看漏的操作收拢到一个界面上完成。当然这不意味着要彻底抛弃终端——实际上 BrewUI 在设计上更像是Homebrew 的仪表盘背地里执行的依然是 brew 系列的底层命令这一点后面我会专门展开。今天这篇就把我用 BrewUI 的完整过程梳理一遍它解决了什么问题、安装时最容易踩的 Intel Mac 报错坑、核心功能逐个拆解、和终端命令的对应关系以及卸载 Homebrew 时最常见的残留问题怎么清干净。有实际操作也有排查思路希望能帮到正在折腾或者准备折腾 Homebrew 的读者。2. 先搞懂 BrewUI 管的是什么formulae、cask 和 macOS 包管理的基本盘2.1 formulae 和 cask 到底有什么区别要理解 BrewUI 的价值绕不开 Homebrew 的两个核心概念formulae和cask。这两个词是 Homebrew 世界里的基础名词但很多人用了很久也没完全搞清楚区别。formulae 是命令行工具的安装描述文件比如 git、python、node、wget 这些都是 formulae。它们通常需要通过源码编译或者在预编译二进制包的基础上下载解压然后软链到系统的 PATH 目录里。cask 则是图形界面应用的安装描述文件比如 Google Chrome、Visual Studio Code、微信、钉钉、Sketch 这一类。cask 的本质是把一个 .dmg 或 .pkg 的安装过程自动化你不需要手动拖拽图标到 Applications 文件夹一条命令就能完成下载、挂载、拷贝、卸载的全过程。在 Homebrew 的目录结构里两者也是分开存放的formulae 装进Cellar目录cask 装进Caskroom目录。BrewUI 的界面上也会明确区分这两个类别用不同的标签页展示这是它比单纯在终端里看输出直观很多的地方。你在终端里执行brew list默认只显示 formulae要加--cask参数才能看到图形应用而在 BrewUI 里这两个列表是并排展示的哪些是工具、哪些是应用一目了然。2.2 BrewUI 的数据从哪里来BrewUI 本身不维护包源它读取的是 Homebrew 自己的数据库和 API 返回的数据。安装完 Homebrew 之后系统里会有一套完整的本地仓库包含 formulae 和 cask 的定义文件同时 Homebrew 也会通过 JSON API 获取最新的包信息和版本更新。BrewUI 在启动时读取这些数据再通过图形界面呈现给用户。所以使用 BrewUI 有一个前提你的 Homebrew 本身必须工作正常。如果brew list在终端里都会报错那 BrewUI 大概率也打不开完整的包列表。它不是 Homebrew 的替代品而是 Homebrew 的翻译官和展示层。这也是我在排错时的一个基本思路——界面出了问题第一步永远是回到终端跑一遍brew doctor先确认底层健康再排查界面层的问题。2.3 依赖关系Homebrew 最强大也最容易忽略的部分Homebrew 的依赖管理是它比手动编译安装高明的地方。比如你要安装某个 Ruby 版本管理工具它可能会自动装上 openssl、readline、libyaml 等一系列依赖。这些依赖在正常工作时没什么存在感但当你卸载主包时它们并不会自动跟着消失。在终端里查看依赖关系你要敲brew deps --tree 包名输出的是一大段树形结构的字符画小屏幕上看非常费劲。BrewUI 会把依赖关系用可视化的方式展示谁依赖谁、哪些包已经不再被任何主包依赖、哪些包是冗余的孤儿依赖界面上直接能看到。配合brew autoremove一键清理这对保持系统整洁的帮助非常大。3. 安装 BrewUI 的完整链路以及 Intel Mac 上 Homebrew 报错的排查记录3.1 前置环境检查八成报错都出在这一步我自己遇到过也帮人排查过不少安装问题先说一个规律Intel Mac 上安装不了 Homebrew的报错八成都不是 Homebrew 本身的问题而是前置环境不满足。BrewUI 的运行依赖 Homebrew所以在装 BrewUI 之前我建议先按顺序做一遍检查确认你的 macOS 版本。Homebrew 目前要求 macOS 13Ventura及以上版本作为正式支持基线太老的系统比如 10.13、10.14装最新版 Homebrew 会有兼容性报错。确认 Xcode Command Line Tools 已经安装。在终端执行xcode-select --install如果提示 command line tools are already installed那就没问题。确认 CPU 架构。Intel Mac 上 Homebrew 的默认安装路径是/usr/localApple Silicon 是/opt/homebrew。很多人安装脚本跑完提示成功但后续命令找不到就是因为 PATH 里没有加对应目录。如果你在 Intel Mac 上执行安装脚本时看到类似curl: (7) Failed to connect to raw.githubusercontent.com port 443这种网络连接报错千万别急着反复重试。这个错误绝大多数情况下是网络层面的问题反复重试只会浪费时间。3.2 Intel Mac 安装 Homebrew 报错的完整排查链路我把一次典型的 Intel Mac 安装失败过程完整复盘一下读者可以按这个顺序自查。第一步确认网络连通性。先试试ping raw.githubusercontent.com如果延迟很高或者直接超时说明默认源不可达。很多人第一反应是挂代理但我要强调一点完全没必要而且我不建议在安装系统级包管理器时引入代理变量很容易导致后续环境变量混乱。更好的方案是直接切换到国内镜像源清华、中科大都有完整的 Homebrew 镜像。第二步清理旧的安装残留。如果你的机器以前装过 Homebrew但没有完全卸载干净安装脚本会在中途报错。常见的残留包括/usr/local/Homebrew目录、/usr/local/bin/brew软链、~/.zprofile里的 PATH 声明。这些残留会让新安装脚本误以为已经安装过然后跳过关键步骤最后 brew 命令找不到。第三步确认目录权限。Intel Mac 上/usr/local目录的权限问题非常经典。系统升级、迁移助手恢复、多个用户共用一台机器都可能导致/usr/local下的某些子目录 owned by root。执行安装脚本时当前用户没有写入权限就会在mkdir这一步报Permission denied。我当时的处理方式是# 查看 /usr/local 的属主 ls -ld /usr/local # 如果属主不是当前用户递归修正谨慎操作仅建议在个人电脑上执行 sudo chown -R $(whoami) /usr/local执行完这条命令后重新运行 Homebrew 官方安装脚本基本就能顺利通过。第四步换镜像源重试。网络和权限都确认没问题但依然失败那就直接用镜像源安装。中科大镜像提供的安装方式是在终端里设置环境变量再执行安装脚本这样脚本拉取仓库时走的就是国内服务器速度快很多也稳定很多。这种方式本质上是安装过程加速装完之后还需要把 Homebrew 的远程仓库地址换成镜像地址否则后续brew update还是会卡住。3.3 安装 BrewUI 的几种方式BrewUI 的安装路径比较多样取决于你拿到的是哪种发布形式。我用过两种比较主流的方式方式一通过 Homebrew 直接安装如果你从社区仓库里找到 cask 定义。在终端执行brew install --cask brewui这种方式最省心后续升级也直接brew upgrade就能完成。但需要注意如果这个 cask 定义不存在这条命令会报错不要硬着头皮重试换下一种方式即可。方式二通过官方 GitHub Releases 下载编译好的应用包。这类项目一般会把编译产物打包成 zip 或 dmg拖进 Applications 就能用。macOS 首次打开会提示已阻止打开未受信任的开发者应用这是 Gatekeeper 机制可以在系统设置 → 隐私与安全性里手动允许。装完之后第一次打开 BrewUI它会自动检测你机器上的 Homebrew 安装状态。如果你还没装 Homebrew界面会直接提示你先完成 Homebrew 的安装。这时候按我上面列的排查链路走一遍把 Homebrew 问题解决掉再回来打开 BrewUI就一切正常了。3.4 装完 BrewUI 之后的首次启动检查BrewUI 启动后第一件事不是急着升级包而是先看界面左下角或状态栏里的 Homebrew 状态提示。有的版本会直接调用brew doctor并把结果展示出来比如Warning: Unbrewed dylibs were found in /usr/local/lib就是经典的残留警告。如果界面上没有任何错误提示说明 Homebrew 环境健康可以开始正常使用。这里有个小建议首次使用可以先把自动刷新或者启动时刷新选项打开让 BrewUI 在后台跑一遍brew update把本地包索引更新到最新。后续升级操作的耗时能短不少。4. BrewUI 的核心功能逐项拆解从包列表到批量升级再到依赖清理4.1 包状态总览与过滤BrewUI 主界面最核心的展示区域是包列表。它会把本机安装的 formulae 和 cask 分开成两个标签页每个条目后面标注版本号、最新版本号、安装日期、依赖数量这些元信息。状态上主要分三类up-to-date已是最新、outdated有可用更新、uninstalled已卸载但配置残留。我用下来最顺手的是它的搜索和过滤功能。在终端里brew search默认是模糊匹配结果是一长串清单BrewUI里直接输入关键字实时过滤还会标注哪些已安装、哪些没有。这个功能在想要找一个软件替代品的时候特别好用。4.2 批量升级与选择性升级Homebrew 的升级在终端里只有两个选择全部升级或者指定单个包升级。BrewUI 则支持在列表上勾选多个包只对选中的那些执行升级这个灵活性非常实用。为什么选择性升级重要因为一些大型软件包升级之后可能引入破坏性变更比如数据库版本不兼容、Python 版本切换导致虚拟环境失效。我就遇到过一次升级某个版本的 openssl 之后一堆编译依赖直接崩掉。用 BrewUI 的批量勾选可以避开那些暂时不想动的关键包只升级低风险的包把不确定性降到可控范围。升级原理上BrewUI 执行的依然是对应的 brew 系列命令只不过它能把升级过程做成一个带进度条的任务列表。你在界面上能实时看到当前执行到哪一个步骤下载了多少、校验是否通过、是直接软链还是走了编译。对于有过程强迫症的人来说这种可见性非常舒服。4.3 清理缓存与孤儿依赖Homebrew 常用的清理命令brew cleanup在 BrewUI 里被做成了清理按钮可以单独清理某个包的历史版本也可以一键清理整个缓存。缓存目录一般在~/Library/Caches/Homebrew我见过不少人的这个目录膨胀到几十个 G都是平时升级攒下来的界面上一键清理就能释放大量磁盘空间。更重要的是brew autoremove的集成。BrewUI 会统计当前所有包的依赖关系识别出那些没有任何主包在引用它们的孤儿依赖并明确提示可以安全移除。这个功能在终端里很难快速发现除非你手动运行brew autoremove --dry-run看输出而 BrewUI 把所有孤儿依赖铺开列出来你可以逐个确认再决定清理哪些。4.4 日志与异常排查BrewUI 里能看到每次操作的日志输出这一点在排查问题时非常方便。终端里你跑brew upgrade时错误信息刷过去了就没了而 BrewUI 会保留历史操作记录包含完整的标准输出和错误输出。你可以回滚看上一次升级到底是在哪个依赖上失败的甚至可以复制完整的错误信息去搜索引擎查不需要重新跑一遍复现。日志功能还暴露了每个包安装时执行的具体脚本路径对于有洁癖、想搞清楚这个包到底改了系统哪些地方的人这个视角很友好。5. Homebrew 基本操作对照清单终端命令和 BrewUI 的双向学习5.1 高频操作一页对照表很多人刚接触 BrewUI 时会有一个困惑界面上某个按钮到底对应终端里的哪条命令我用表格整理一份高频对照方便两边切换。操作目的终端命令BrewUI 对应操作更新 Homebrew 自身及包索引brew update启动自动刷新 / 点击刷新按钮查看所有已安装包brew list/brew list --cask包列表页签中的 formulae / cask查看可更新包brew outdated列表状态筛选有更新安装某个包brew install 包名搜索包后点击安装按钮卸载某个包brew uninstall 包名选中包后点击卸载升级所有包brew upgrade全选后点击升级按钮升级指定包brew upgrade 包名勾选指定包后点击升级清理旧版本和缓存brew cleanup清理按钮移除孤儿依赖brew autoremove孤立依赖提示区一键移除检查环境健康brew doctor启动时状态检查 / 手动触发体检查看包详情brew info 包名包详情页签查看依赖树brew deps --tree 包名依赖可视化面板这张表的核心价值在于即使你打算长期使用 BrewUI也一定要知道它背后的命令。因为 BrewUI 只是前端一旦遇到它没有覆盖到的边缘场景比如安装一个不在仓库里的本地包、打一个自定义 tap你还是得回终端操作。5.2 用 BrewUI 反向学习终端命令我推荐给新手的思路是反向学习先在 BrewUI 里看明白一次操作产生了什么效果再去终端里敲对应的命令看输出和界面信息的对应关系。比如先点一个包的升级按钮观察界面上的进度条再去终端跑一遍brew upgrade 包名对比两边的输出信息你会很快熟悉 brew 命令的常见输出格式。这个方式比死记命令效率高得多。因为 Homebrew 的命令设计本身很规律对象 动作brew list是看列表brew info是看详情brew install是安装brew uninstall是卸载只要你记住了命令动词不需要背参数也能猜个大概。5.3 新手最容易犯的 Homebrew 操作错误针对刚开始用 Homebrew 的读者我额外分享几个高频错误把 brew 和 sudo 一起用Homebrew 的设计初衷就是不用 sudo 操作如果在终端里看到sudo brew这样的用法说明要么目录权限坏了要么用的姿势不对。正确做法是先把目录权限修好而不是给 brew 命令加 sudo。升级完不清理长期不清理旧版本文件会堆满磁盘。建议养成每次大版本升级之后跑一次brew cleanup的习惯。乱移除依赖brew uninstall --ignore-dependencies这个参数要慎用它会把主包卸载掉但保留其依赖短期看没什么问题长期会积攒大量孤儿依赖。除非明确知道这个包安装了哪些依赖、并且确定这些依赖没被别的包引用否则不建议这么操作。6. 卸载残留问题BrewUI 卸干净之后Homebrew 自己怎么彻底清理6.1 卸载残留到底指哪些文件不少人在卸载 Homebrew 相关工具之后发现系统里还是有很多痕迹。这个问题的根源在于 Homebrew 的安装布局分散在系统的多个目录不是只删掉一个文件夹就能清干净。BrewUI 卸载后你可能在以下位置找到残留Homebrew 安装目录本身Intel Mac 上是/usr/local/HomebrewApple Silicon 上是/opt/homebrew符号链接目录/usr/local/bin、/usr/local/lib、/usr/local/opt里指向 Homebrew 的软链缓存目录~/Library/Caches/Homebrew日志目录~/Library/Logs/Homebrew仓库目录~/Library/Caches/Homebrew下的下载缓存Shell 配置文件~/.zprofile、~/.bash_profile、~/.zshrc里的 PATH 和 Homebrew 变量配置~/Library/Application Support/Homebrew、~/Library/Preferences下可能存在的配置文件布雷UI 卸载工具如果做得好会把这些都清掉但如果它只是简单地把应用拖进废纸篓那大量残留文件还在磁盘上躺着。6.2 检查残留的排查链路我建议按这个顺序排查第一步检查核心 brew 命令是否还在。which brew brew --version如果which brew还有输出说明 brew 本体还没删干净需要继续执行卸载脚本。第二步检查安装目录。ls -ld /usr/local/Homebrew ls -ld /opt/homebrewIntel Mac 和 Apple Silicon 的路径不同都看一下比较稳妥。如果目录还在先删掉。第三步检查配置文件里的 PATH 声明。grep -n homebrew ~/.zprofile ~/.bash_profile ~/.zshrc 2/dev/null有输出就说明 shell 配置文件里还有残留配置需要手动删除对应行。第四步检查缓存和日志目录。du -sh ~/Library/Caches/Homebrew ~/Library/Logs/Homebrew 2/dev/null如果这些目录还占几 G 空间它们就是主要的隐形杀手。第五步检查软链。ls -la /usr/local/bin | grep homebrew有些残留软链虽然不影响系统运行但会影响下一次重新安装 Homebrew 的干净程度。6.3 清理操作的完整步骤如果你确认已经不需要 Homebrew 和 BrewUI可以按下面这个流程清理# 1. 如果 brew 命令还能用先自卸载 brew cleanup --pruneall brew autoremove /bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)卸载脚本运行的时候它会问你是否确认删除所有文件选择 y这一步会清理掉 Homebrew 的主体目录。# 2. 手动删除剩余目录 rm -rf /usr/local/Homebrew rm -rf /opt/homebrew # 3. 清理缓存和日志 rm -rf ~/Library/Caches/Homebrew rm -rf ~/Library/Logs/Homebrew # 4. 删除 Application Support 下的残留 rm -rf $HOME/Library/Application Support/Homebrew最后编辑 shell 配置文件把eval $(/opt/homebrew/bin/brew shellenv)或者/usr/local/bin/brew shellenv这一行注释或删除掉。这里有个细节不同版本的安装脚本写入的 PATH 行略有不同建议用grep -n brew搜索确认而不是手动猜。清理完重启终端再执行brew --version确认报错 command not found就说明 Homebrew 已经干净地从系统里移除了。这时候重新从零安装 Homebrew不会再遇到残留导致的冲突问题。6.4 残留清理时最容易踩的坑很多人在清理时容易犯一个错误发现有文件删不掉就直接sudo rm -rf强删。在/usr/local这种系统级目录下我不建议这样做。因为/usr/local下面可能还有你自己编译安装的其他软件直接强删整个目录会把它们一起带走。我的经验是保留/usr/local这个目录本身只删除里面与 Homebrew 相关的子目录和文件。比如/usr/local/Homebrew、/usr/local/Cellar、/usr/local/Caskroom、/usr/local/Frameworks这些才是 Homebrew 的内容。如果你删掉了/usr/local本身系统会新建一个新的空目录但之前自己手动安装的其他二进制文件就全部丢失了。7. 实际使用一段时间后的心得以及两个实用小技巧7.1 什么时候用 BrewUI什么时候又必须回到终端用 BrewUI 当主力做包管理的这段时间我慢慢形成一个分工习惯日常的安装、升级、清理、查看依赖用 BrewUI涉及自定义源、调试编译参数、处理冲突的深度操作回终端。原因是 BrewUI 的抽象层做得很方便但它不可能覆盖 Homebrew 的全部能力。比如安装一个带编译选项的包终端里可以brew install 包名 --with-xxxBrewUI 的界面上大概率不会暴露这种编译期参数再比如处理两个包之间的文件冲突需要手动比较两个包的安装文件列表这在终端里用brew list --verbose更清楚。说白了BrewUI 把常用场景做得更好用了但不会让你变成一个只需要点按钮不需要懂原理的运维。7.2 两个值得记住的小技巧第一个技巧是关于升级顺序的。BrewUI 的批量升级界面里我通常会先勾选依赖树底层的包比如 openssl、zlib、readline升级完再刷新依赖图最后升级顶层的应用包。这个顺序能显著降低升级失败的概率因为底层库的版本更新往往影响大量上层包。如果反过来先升级上层应用再升级底层库有可能出现应用已经是最新但底层库还是旧版本的错位。第二个技巧是善用brew doctor的触发时机。不要等出了问题才想起来跑它。我习惯每两周主动在 BrewUI 里触发一次环境体检看看有没有 Warning。体检输出里最常见的 Warning 是unbrewed dylibs、unbrewed header files、config files in unexpected locations这三种它们本质上都指向同一个问题系统里有非 Homebrew 方式安装的文件混进了 Homebrew 的目录。发现这类警告尽快把对应的文件挪走或删除可以避免很多奇怪的编译错误。7.3 总结我对 BrewUI 的个人体感回到标题本身BrewUI 这个项目解决的其实是一个信息呈现的问题。Homebrew 的能力一直都在那里命令行能做的事它也全部能做但终端的输出形式对人不友好尤其是包的数量一旦上百纯文本列表的信息密度反而成了负担。BrewUI 用列表、状态标签、依赖图、日志面板这些更接近人类阅读习惯的方式重新组织了这些信息让管理本机软件包这件事从敲命令加看输出变成了看状态加点按钮。当然它不是万能的。如果你问我是不是所有 Homebrew 用户都应该装 BrewUI我的答案是不一定。终端熟练度很高、习惯一切用键盘操作的人用 BrewUI 反而多此一举但如果你觉得自己在 Homebrew 维护上花的时间太多或者你正在帮家里人的 Mac 做维护、不希望他们接触命令行那 BrewUI 就是非常合适的中间层。在我自己的机器上BrewUI 已经成了每周维护的固定入口。周末打开它看看有没有更新清理一波缓存检查一下孤儿依赖全程不用开终端。这台机器到现在跑了将近一年Homebrew 目录的膨胀速度明显比之前纯命令行时期慢了很多。光凭这一点我就觉得这个项目值得推荐。