1. BrewUI 到底是个什么东西
先说结论:BrewUI 是给 Homebrew 包管理器加的一层图形化操作界面,把平时在终端里敲的brew list、brew upgrade、brew cleanup这些命令,变成一个个可以点击的按钮和列表。如果你用 macOS 做开发,大概率已经离不开 Homebrew 了,但你也可能对它又爱又恨——装包确实方便,可真要管理起来,那一长串命令行输出实在不太友好。
我第一次听到 BrewUI 这个项目,是在一个技术社区里偶然刷到的。当时一个同事抱怨说,他电脑上装了快两百个 brew 包,每次想看看哪些该升级、哪些能清理,都得打开终端一条条敲命令,输出刷屏刷得眼睛疼。有人回了一句“那你去试试 brewui”,我顺手搜了一下,发现这个工具正好切中了这个痛点。
简单说,BrewUI 做的事情有三件:
- 把 Homebrew 管理的所有包(formulae 和 casks)用可视化列表展示出来,包括名称、版本、安装时间、依赖关系。
- 把升级、卸载、清理、搜索这些高频操作封装成按钮,点一下就行,底层还是调用 brew 命令。
- 提供依赖关系、磁盘占用、更新日志等信息面板,帮你判断“这个包到底能不能删”“那个包升级会不会炸”。
对于命令行老手,可能觉得“终端几行命令就能搞定,何必装个 GUI”。这个观点不算错,但 BrewUI 真正适用的场景不是“能不能用”,而是“效率和管理体验”。尤其是包的规模上来以后,视觉化呈现的信息密度远超命令行输出。你一眼就能看到哪个包占了几百 MB、哪个包被多个项目依赖、哪个包的升级常年失败,这些信息在终端里得拼凑好几条命令才能搞清楚。
从项目性质上讲,BrewUI 是一个典型的“效率工具型”开源项目,屏障不高、但实用价值很直接。它适合几类人:刚接触 macOS 开发、对终端还不熟悉的新手;装了太多包、管理成本开始失控的重度用户;以及像我这样喜欢把一切“可视化”折腾一遍的工具控。要是你平时只装了三五个小工具,那它的意义不大,可一旦 brew 包数量超过几十个,你就会发现这层 UI 真的能省不少时间。
2. 安装 BrewUI 之前,先弄懂它的两个前提
2.1 Homebrew 环境检查
BrewUI 不管界面做得再漂亮,本质上它只是一个“驾驶舱”,发动机还是 Homebrew 本身。所以安装 BrewUI 的第一个前提,就是你的 Mac 上必须已经装好 Homebrew,而且最好是最新版本。
检查 Homebrew 是否正常,最简单的命令是:
brew --version能看到类似Homebrew 4.x.x的输出,就说明本体没问题。接下来还要确认 brew 命令可以被正常调用,并且不需要 sudo 之类的特殊权限:
which brew正常情况下,Intel Mac 会输出/usr/local/bin/brew,Apple Silicon Mac 会输出/opt/homebrew/bin/brew。如果你发现which brew输出的路径很怪,或者根本找不到,说明 Homebrew 安装得不标准,这种情况建议先修好 Homebrew 再考虑 BrewUI。
另外一个容易被忽略的点:BrewUI 底层依赖的是brew命令的标准输出,它需要解析一些 JSON 数据。这个功能 Homebrew 很早就内置了,老版本也能用,但如果你的 Homebrew 停留在远古版本,还是建议先升个级:
brew update && brew upgrade我自己踩过的坑是:一开始以为 Homebrew 装好了就行,结果 BrewUI 首次启动时一直提示“无法获取包列表”,排查了半天才发现是 Homebrew 版本太老,brew info --json=v2的输出格式不兼容。所以这一步别跳过,基础环境干净了,后面才省心。
2.2 安装 BrewUI 的几种方式
BrewUI 的安装方式目前主要有三种:官方预编译包、通过 Homebrew 本身安装、从源码构建。我自己实际用下来,最推荐第一种,快捷省事,也不用关心编译依赖。下面一个一个说。
方式一:下载官方预编译包
这是最推荐的方式。直接去项目的发布页面下载对应你芯片架构的压缩包(注意区分 Intel 和 Apple Silicon),解压后把 BrewUI.app 拖入“应用程序”文件夹即可。第一次打开如果被 Gatekeeper 拦了,可以在“系统设置 → 隐私与安全性”里点“仍要打开”,因为开源项目没做官方开发者签名,这一步是正常的。
方式二:用 Homebrew 安装
有点套娃味道,但确实可行。如果项目维护了相关的 cask 或 tap,你可以用 brew 来装 BrewUI,好处是之后的升级可以统一用 brew 管理,算是一个小便利。具体命令以项目仓库的 README 为准,因为这类第三方 cask 的仓库变动比较频繁。
方式三:从源码构建
适合想要自己改代码的玩家。BrewUI 的前端技术栈比较主流,克隆仓库后安装依赖再打包,步骤不复杂,但需要本机装好 Node.js 和 Xcode Command Line Tools。源码构建的意义在于你可以提前体验未发布的特性,或者自定义一些界面逻辑。如果只是日常使用,没必要走这条路。
无论哪种方式,装完之后先别急着操作,打开 BrewUI 让它加载一次本地包数据,观察一下输出面板的日志有没有报错。常见的“红字”错误大概率是权限问题或 Homebrew 路径异常,这些问题在后面的章节会专门讲。
3. BrewUI 的安装流程与第一印象
3.1 从下载到跑起来的完整流程
以官方预编译包的方式为例,我把整个流程走一遍,方便你对照参考。我的机器是 Apple Silicon,所以选择 arm64 版本的包。
第一步,确认架构。终端里输入:
uname -m输出arm64就是 Apple Silicon,输出x86_64就是 Intel Mac,下载对应包就行。万一选错架构,应用也能跑,但性能和兼容性会打折扣,没必要。
第二步,下载并解压。拿到.zip或.dmg文件后,解压到临时目录,然后把BrewUI.app拖进“应用程序”文件夹。这里有个小细节:如果解压出来的不是.app包而是一个可执行文件,说明你下载的是命令行版本,可以把它放到/usr/local/bin或~/.local/bin,然后在终端里直接输入brewui启动,效果是一样的。
第三步,首次启动。双击图标后,Mac 可能会弹出一个警告,提示“无法验证开发者”。因为很多开源项目没有购买 Apple Developer 证书,这条警告不代表木马或病毒,只是系统对未签名应用的通用拦截。处理方法是在“系统设置 → 隐私与安全性”中点击“仍要打开”,然后在弹窗中再次确认。
第四步,等待数据加载。BrewUI 启动后会调用brew list --formula、brew list --cask、brew info --json=v2等命令获取本地包数据。包数量不多时几秒就好,如果装了上百个包,加载动画可能要多转一会儿,这是正常的。我第一次打开时等了好几秒,一度以为卡死了,后来才发现它在后台跑数据同步。
第五步,确认版本信息。在 BrewUI 的主界面,通常能找到 Homebrew 版本号、包数量、可升级数量、磁盘占用等概览信息。如果这些数字能正常显示,说明链路全通了。
3.2 首次启动界面解读与核心区域
BrewUI 的界面设计逻辑其实是照着“包管理器后台”来做的,你会看到几个核心区域:
- 总览仪表盘:显示 Homebrew 的版本、formula 数量、cask 数量、待升级数量、总磁盘占用。这一块相当于整个系统的“体检报告”,我每次打开都会先扫一眼有没有数字异常。
- 包列表区:左右布局,左侧是分类标签(formulae / casks / 已禁用 / 有更新可用),右侧是包列表。列表支持按名称、版本、安装时间排序,也能用搜索框过滤。
- 详情面板:点击任意一个包,右侧或底部会展开详情,包括依赖树、反向依赖、安装路径、更新日志、维护者信息等。
- 操作按钮区:针对选中包的操作按钮,比如升级、卸载、打开官网、复制安装命令等。这些按钮对应到终端里,其实就是一条条 brew 命令。
我第一次用的时候,最大的感受是“信息终于能看全了”。终端里的brew list只能告诉我包名,brew info又只能看单个包的详细信息,而 BrewUI 把这两个维度合并成了一个可交互的界面。想查“gnupg 是干嘛的”“ffmpeg 依赖了多少库”“哪个 cask 占了 1GB 空间”,都是点几下的事。
3.3 启动速度优化与菜单栏常驻技巧
BrewUI 的启动速度跟包数量和 Homebrew 自身的响应速度正相关。如果你感觉每次打开都要等很久,可以试试这几个优化手段:
- 给 Homebrew 配置国内镜像源。这一步可以显著加快
brew update和包信息获取的速度。注意,镜像源的选择要合规,我一般只设置HOMEBREW_API_DOMAIN和HOMEBREW_BOTTLE_DOMAIN这类环境变量,速度提升非常明显。 - 手动执行一次
brew update,让本地索引保持最新,BrewUI 启动时的增量同步会快很多。 - 如果只是想要一个托盘图标而不是完整窗口,可以看看 BrewUI 设置里有没有“最小化到菜单栏”或“开机自启”选项。我在实际使用中把这当成一个能和其他效率工具常驻菜单栏的模式来用,随时点开看一眼升级通知,比每次开终端方便不少。
4. 核心功能逐个拆:从列表到清理,哪些操作真的值得点鼠标
4.1 包列表与信息详情:一目了然的“资产盘点”
BrewUI 最基本的价值,就是把 Homebrew 管理的包变成一份“可筛选的资产清单”。这里面有两个功能细节特别值得说。
第一个是公式包和桌面应用的分类展示。在 Homebrew 的体系里,formula指的是命令行工具和库,cask指的是图形化应用(比如 Chrome、VS Code)。终端里用brew list默认只列 formula,想看 cask 得额外加参数。而 BrewUI 会把这两类分开列,还支持一键切换或合并展示。我这种装了上百个包的人,终于能分清楚“那些是命令行工具、那些是 GUI 软件”了。
第二个是安装时间排序和反向依赖查看。大多数人不记得某个包是什么时候装的,也不清楚它被谁依赖着。BrewUI 的列表里通常会展示安装时间和大小,详情面板里则有正向依赖(它依赖什么)和反向依赖(谁依赖它)两张图。这个功能对“安全卸载”非常重要。你想删一个包的时候,先看一眼反向依赖,如果一堆包都依赖它,删了就会连锁反应;如果没有任何反向依赖,说明它是独立安装的,删起来就没心理负担。
从原理上讲,这些数据并非 BrewUI 自己攒的,而是调用 Homebrew 的 JSON 输出接口拿到的。Homebrew 从 2.x 版本开始就支持输出结构化 JSON,BrewUI 做的只是把这些 JSON 解析、分类、呈现。所以它的信息准确度跟终端是一致的,不存在“UI 里显示的和命令行不一致”的情况。
4.2 一键升级:批量操作背后的风险控制
brew upgrade在终端里是一条命令,但实际跑起来可能刷出几百行日志,遇到 bug 还不知道是哪一步出的问题。BrewUI 把升级拆成了几个粒度:
- 全部升级:一次点完所有可升级的包。
- 指定升级:在列表里勾选部分包,只升级选中的。
- 强制重装:某个包升级后行为异常,可以直接重装回最新版本。
我日常用得最多的是“指定升级”。原因很简单,不是所有包都适合第一时间升级。比如我本地有个旧项目依赖老版本的 OpenSSL,如果手滑把 OpenSSL 升了,那个项目大概率原地爆炸。所以我的策略是:在 BrewUI 里扫一眼可升级列表,过滤出“小版本更新”和“无破坏性变更说明”的包批量升,依赖环境敏感的大版本升级则单独评估后再动手。
关于升级的底层逻辑,这里解释一下。brew upgrade做的事情并不是简单地装新版本,它还会处理依赖关系的变化、执行 post-install 脚本、更新服务配置等。所以升级过程出现意外并不罕见。BrewUI 的界面上,你可以直接查看每个包升级项的更新日志,提前判断可能的风险。这比在终端里盲敲命令要踏实得多。
4.3 清理功能:磁盘空间的“大扫除”
Homebrew 用久了,磁盘上会积累大量旧版本源码包、下载缓存和编译中间产物。终端里有brew cleanup -n可以预览会清理多少空间,brew cleanup实际执行清理。BrewUI 在这个基础上做了一层可视化,你会看到“可清理空间 XX MB”“旧版本包列表”“日志与缓存文件”这些分类。
我用 BrewUI 的清理功能做过一次真实的“大扫除”,效果非常直观。那天它显示可清理 4.3GB,我点了一下确认,输出面板开始滚动清理日志,几秒后磁盘就空出了这么多空间。其中有相当一部分是旧版本的 Python 和 Node.js 安装包缓存,这些在纯终端环境里基本是“隐形垃圾”。
需要提醒的是,清理功能它不是“删掉某个应用”,而是清理 Homebrew 产生的冗余文件。已安装的应用本身不会被动。不过我也建议你执行清理之前,看一眼预览清单里有没有想保留的缓存包,特别是当 Homebrew 被设置为离线安装源的时候,缓存删了反而麻烦。
4.4 搜索与安装新包:从“网上找命令”到“界面里搜一下”
BrewUI 内置了包搜索功能,背后调用brew search的远程数据。你可以输入“nginx”“wget”这种关键词,也可以直接搜索模棱两可的描述。搜索结果会列出匹配的 formula 和 cask,并提供安装按钮。
我在终端时代装新包的习惯是:先想去哪个网站查,或者直接凭印象敲brew install xxx,不对再改。有 UI 之后舒服多了,搜索框里敲几个字,候选列表就出来了,还能比对描述,不会出现“名字差不多但其实装错了包”的情况。
安装按钮所触发的命令仍然是brew install,所以安装过程该编译还是编译、该下载还是下载,UI 只是把这条命令的输入和输出包装好了。新手如果担心装错,可以在安装前点进详情页看看 Description 和维护状态,这个信息在终端里要看半天,在 UI 里是读一遍就懂的口语化描述。
4.5 依赖关系可视化:删包之前先看这一页
Homebrew 的依赖关系用终端也能看,brew deps --tree 包名可以输出一棵树。但纯字符的树形图一旦层级多了,看起来就很痛苦。BrewUI 一般会做可视化的依赖图,有的实现是力导向图,有的是树形目录,至少也是缩进清晰的列表。
这个模块的实际价值在两处。一是判断“这个包是不是多余的”。如果一个包没有反向依赖,同时你没有主动使用它的记忆,那它大概率是以前某次安装的残留,可以清理。二是在卸载一个核心包之前,看看它会导致多少下游包失去依赖。依赖断链的骚操作,我在终端时代踩过好几次坑,比如卸载了一个公共库,结果好几个工具第二天就罢工了。前来连环排查的时候发现是依赖没了,确实头大。
4.6 Tap 与多源管理:进阶选手才用得到的控制力
Homebrew 的 tap 机制相当于给包管理器额外接了“软件源”。brew tap homebrew/cask-drivers就是添加一个驱动类应用的源。BrewUI 在 Tap 管理上的呈现,一般是在设置页或独立标签页,列出所有已添加的 tap、它们的远端仓库地址、以及当前同步状态。
对普通用户来说,这个功能可能一辈子都用不上;但如果你维护私有的 formula,或者公司内部有一套分发工具链,Tap 管理就会派上大用场。你可以在 BrewUI 里添加/移除 tap、直接看到拉取状态、一键同步远端更新,比记忆brew tap和brew untap的参数要直观得多。
我建议至少把“已添加了哪些 tap”当成一个定期检查项来对待。别人塞给你的第三方 tap 如果长时间不维护,轻则安装报错,重则引入不安全的构建脚本。在 BrewUI 里一眼扫完所有 tap 的状态,能避免很多潜在问题。
5. 实战记录:一次完整的“检查—升级—清理”全流程
理论说了不少,这一节我完整复盘一次用 BrewUI 做例行维护的真实过程,你可以直接照着这个流程走。
5.1 启动后的“体检”顺序
打开 BrewUI,先看总览仪表盘。我那天看到的数据是:formula 137 个、cask 46 个、有更新 23 个、可清理空间 3.8GB、Homebrew 版本 4.2.x。这些数字本身就是一份体检结论:包数量不算少,更新不算多,磁盘有清理空间。
接下来我做了两件事:
- 在设置里点了“检查 Homebrew 更新”,确认 brew 本身是最新版。
- 看了一下列表里“有更新可用”的过滤结果,逐个扫一眼更新日志,判断有没有敏感的大版本变更。
这两步都在终端里对应brew update和brew outdated --verbose,但在 BrewUI 里就是点按钮和读卡片。信息密度高了一截,决策效率明显提升。
5.2 升级顺序与部署策略
我的升级策略是“分两批走”。
第一批,处理不敏感的小工具:比如jq、yq、tree、ripgrep这类纯命令行工具,没有复杂的依赖链路,直接全选升级,风险基本为零。点“批量升级”后,输出面板会逐条滚动命令日志,每个包升级成功会打勾,失败会标红并给出错误信息。我一次把所有小工具都升完了,耗时不到一分钟。
第二批,处理带依赖的关键组件:比如python、node、ffmpeg、openssl这些,升级前重点看更新日志里的“Breaking Changes”。如果有明显的破坏性变更,我在 UI 里根本不会点“升级”,而是先去搜一下下游兼容情况再决定。那天python有一个小版本更新,日志里没有明显的破坏性描述,我才放心升了。升完之后,我手动执行了一次:
python3 --version确认版本号正常、虚拟环境还能用,这才算真正放心。
整套流程走完,23 个可升级的包全部处理完毕,耗时大约五分钟。如果我全程终端操作,要敲的命令少说也有十几条,中间还得来回看各种输出和日志,效率不在一个量级。
5.3 清理与验证:回收磁盘空间
升级完成后,我给 Homebrew 做了一次大扫除。在 BrewUI 的清理预览页,点开可清理分类,看到旧版本缓存和源码包一共占了 3.8GB。我先确认分类里没有“离线安装包”这类我想留的东西,然后点了“执行清理”。
输出面板很快就滚完了,再回到总览,可清理空间从 3.8GB 变成了几乎为零。我再用终端验证了一下实际效果:
df -h / | tail -1确实多出了好几个 GB 的可用空间。这个过程从头到尾,我只点了几个按钮,而终端里对应的命令其实是一长串brew cleanup --prune=all加各种验证命令的组合。
这里要提醒一句:brew cleanup --prune=all会把所有过期的下载缓存全部删掉。如果你有“把 brew 当离线安装源”的习惯,这个操作会把你的缓存清个精光,后续离线安装时就得重新下载。我自己是保留最近几个版本的缓存派,所以执行前会手动把清理策略设成“保留最新版本”。
6. 常见问题与排查技巧实录
下图是我个人在 BrewUI 使用过程中遇到的一些典型问题,从环境检查到数据异常,整理成了速查思路,供你参考。
| 现象 | 可能原因 | 排查与解决思路 |
|---|---|---|
| 启动后包列表为空 | Homebrew 本身数据异常 | 检查终端brew list是否有输出;必要时brew update重置索引 |
| 升级时报权限错误 | 某目录属主异常 | 不要直接sudo跑 brew;检查brew doctor,再把错误归属目录 chown 回当前用户 |
| UI 显示版本与终端版本不一致 | 数据缓存未刷新 | 在设置里点“刷新数据”,或重启 BrewUI |
| 操作按钮点了没反应 | 后台 brew 进程卡住 | 在设置里查看运行中的任务,强制清理后台任务后重试 |
| 安装包时进度条不动 | 网络源访问慢 | 检查网络;考虑更换合规的镜像源;等待或取消后重试 |
| Gatekeeper 拦截 | 未签名应用 | 系统设置中手动确认“仍要打开” |
| 打开应用即闪退 | 系统版本不兼容或安装包架构选错 | 检查应用日志,确认下载的包适配芯片架构;试试源码构建版 |
下面展开说两个我实际花时间最多的典型问题。
第一个是“升级失败但不知道错在哪”。BrewUI 的友好之处是输出面板会保留完整日志,你可以看到错误信息到底是哪个包、哪一步、什么原因。有一次我升级imagemagick失败,日志里提示是在编译某个依赖时缺少库,一看就是没装 Xcode Command Line Tools。我补装完再点升级,就通过了。这比在终端里对着滚屏日志翻半天要舒服得多。
第二个是“Homebrew 权限异常导致的假死”。症状是 BrewUI 里任何操作都卡住,终端里执行brew list也报错。用brew doctor查了一圈,发现/opt/homebrew里某些目录的属主不对,被改成了 root。这种一般是用 sudo 跑过某条命令后留下的后遗症。正确做法是把属主改回当前用户:
sudo chown -R $(whoami) /opt/homebrew改完再刷新 BrewUI,一切恢复正常。记住一个原则:平时尽量不要用 sudo 跑 brew 命令,除非你非常明确自己在做什么。
7. 用了大半年之后,说几句实在话
如果让我用一句话评价 BrewUI,我会说:它不是“必需品”,但装了之后管理 Homebrew 的体验会顺畅一个档次。尤其是包的数量超过五六十个以后,列表化、可视化管理带来的效率提升是不可忽略的。
我最喜欢它的一个点,永远是依赖关系可视化。作为在这个问题上栽过跟头的人,我深知“随手卸载一个看似多余的包,结果半个开发环境塌掉”的痛苦。有了 BrewUI,每次想动一个包之前,我都会先看两眼反向依赖,这个习惯省了太多不必要的折腾。
我最开始也担心过“UI 会不会遮蔽底层细节,让人失去对系统的掌控感”。实际用下来的体会是:并不会。BrewUI 的所有操作本质上还是触发 brew 命令,输出日志也完整展示,你随时可以切回终端验证。它是一个“更顺手的前端”,而不是一个“黑盒”。
最后再分享一个小技巧:把 BrewUI 放进你的日常巡检清单。时不时的打开、扫一眼仪表盘、看下有没有待升级的项目、清理一下缓存,这个习惯能帮你把包管理器维护从“时候到了才处理”变成“随时保持清爽”。工具的价值不在于功能多花哨,而在于让你更有底气地说一句:我的系统状态,我心里有数。