如果你在 macOS 上装软件,应该绕不开 Homebrew——大家习惯简称它 brew。大多数人的使用方式是在终端敲命令:brew install git、brew services start mysql,这样很高效。但时间一长你会发现一个问题:你根本不知道自己机器上到底装了多少包,哪些是核心依赖,哪些是可以删掉的历史包袱。BrewUI 就是解决这个问题的:一个给 Homebrew 用的图形化界面,它把包列表、依赖关系、自启动服务、更新与清理这些常用功能都搬到可视化面板里。无论你是常驻命令行的开发者,还是平时只会在终端粘一条安装命令的普通用户,都能从这种“看得见”的管理方式里受益。这篇文章就来聊聊 BrewUI 是什么、怎么装、怎么用,以及我在实际使用中踩过的坑。
1. BrewUI 是什么:拆掉终端门槛的一张控制面板
1.1 Homebrew 很强,但缺一个可视化入口
Homebrew 作为 macOS 上使用率最高的包管理器,常年承担着“装软件、更新软件、删软件”的底层角色。它把 Unix 世界里的一切复杂依赖关系藏在了几个简单的命令后面,用户只需要念叨brew install就能完成大部分安装需求。
但它的信息输出方式始终是“文本流”。你敲一个brew list,屏幕上会滚出一长串包名;敲brew outdated,得到的是按行排布的旧版本清单;想看某个包的依赖情况,就得用brew deps --tree 包名慢慢读树状结构。这些命令单看都还好,一旦包的数量多起来,终端就变成了一片密密麻麻的文字海。
我不否认终端的美学魅力,但信息的“可读性”和“可操作性”是两回事。终端能告诉你有哪些包,却不能让你一眼看出哪个包占空间大、哪个包长期没更新、哪个服务正在后台运行。BrewUI 做的事情很简单:把 Homebrew 背后这些零散的数据,整理成一块一眼能看懂的控制面板。
1.2 BrewUI 到底做了什么
BrewUI 本质上不是一个新的包管理器,它更像是一个“前端外壳”。它通过调用 Homebrew 自身的命令行工具来获取数据、执行操作。
这意味着几件事:
- 你看到的所有包列表,底层来自
brew list。 - 你看到的更新提示,底层来自
brew update和brew outdated。 - 你点击升级按钮,底层执行的是
brew upgrade。 - 你启停某个服务,底层跑的是
brew services start/stop。
所以用 BrewUI 不会让你“失去对命令行的掌控”,它只是换了一种更直观的方式触发同样的操作。也正因为底层还是 Homebrew,数据和逻辑都是靠得住的,出了问题也可以回到终端排查,不会陷入一个“黑盒”。
对于一个工具来说,这种“不透支承诺、不给用户增加额外心智负担”的设计,是我愿意持续使用它的核心原因。
1.3 适合谁,不解决什么问题
BrewUI 适合的人群很清晰:
- 平时用 Homebrew 装软件,但记不住花式命令的新手;
- 在终端里能完成所有操作,但想更快看清全局的老手;
- 管理多台机器,想统一检查包状态的运维/开发同学;
- 电脑里积攒了大量 brew 包,想定期清点环境的人。
但它不解决另外一些问题:比如需要脚本化、批量化的自动化场景,或者要在服务器上做无界面管理。GUI 工具再方便,也替代不了脚本和命令行在自动化领域的地位。这点需要有清楚的认知,也决定了我们在日常使用中怎么给它定位。
2. 安装与首次配置:五分钟跑起来
2.1 前置条件:先有 Homebrew,再看系统环境
安装 BrewUI 之前,第一件事是确认本机 Homebrew 环境是正常的。打开终端,执行:
brew --version如果能输出版本号,说明 Homebrew 已经就绪。如果没有安装,需要先到 Homebrew 官网按提示完成安装。
这里有一个重要细节:在不同芯片架构的 Mac 上,Homebrew 的安装路径不一样。Intel 芯片的老款 Mac,默认装在/usr/local/下;而 Apple Silicon(M1/M2/M3/M4)的 Mac,默认装在/opt/homebrew/下。Linux 系统也有对应的路径,常见的是/home/linuxbrew/.linuxbrew/。这些路径在下文会反复用到,建议你先记下自己机器上which brew的输出结果。
BrewUI 本身对系统要求不算苛刻,大多数还在维护周期内的 macOS 版本、主流 Linux 发行版都可以运行。如果你是老旧的 macOS 版本,安装前建议先到对应项目的 Release 页看一下系统支持说明,避免装完之后打不开。
2.2 安装 BrewUI 的两种常见方式
BrewUI 的安装方式和大多数桌面软件一样,主要有两种途径:
方式一:从 GitHub Releases 下载
去项目仓库的 Releases 页面,下载对应你系统架构的安装包(macOS 通常是 dmg 或 zip,Linux 常见的有 AppImage、deb 或 rpm)。下载完成后,把应用拖入“应用程序”目录即可。
方式二:通过 Homebrew 安装
你没看错,BrewUI 本身也可能作为一个 cask 或 formula 被 Homebrew 收录。这种情况下,命令行执行:
brew install --cask brewui不过这个命令能否成功,取决于项目是否已经提交到 Homebrew 的官方仓库,以及你本机的 Homebrew 版本是否更新到了最新。如果仓库里还没有这个包,方式一会更直接。
我个人更推荐用方式一,尤其是想第一时间体验新功能的时候。因为桌面工具迭代通常比命令行工具快,Release 页面上的最新版本往往能覆盖更多新功能和 bug 修复。下载之后,顺手校验一下安装包哈希值是一个好习惯:
shasum -a 256 下载的文件名再和 Release 页面公布的 SHA256 值比对,完全一致再运行。我一般不在这件事上省时间,因为任何需要注入本机环境的工具,都值得多花 10 秒确认来源可信。
2.3 首次启动:连接本地 Brew 环境
第一次打开 BrewUI,它会尝试自动探测本机的 Homebrew 环境。大多数情况下,它能自动找到 brew 可执行文件,然后开始加载包列表数据。
但有时候会碰到“探测失败”的情况。原因很简单:从 Finder 或桌面启动应用时,应用不会自动继承你在终端里配置的 shell 环境,比如 PATH 变量。如果你在~/.zshrc里自定义过 PATH,终端里能用brew,不代表 GUI 应用也能找到它。
解决办法是在 BrewUI 的设置里手动指定 brew 的绝对路径:
# Apple Silicon /opt/homebrew/bin/brew # Intel Mac /usr/local/bin/brew # Linux /home/linuxbrew/.linuxbrew/bin/brew填好路径后,BrewUI 会重新读取数据。首次加载可能偏慢,因为它在后台大概率执行了一次brew update,需要联网刷新索引。如果等了很久还在转圈,可以参考后面第 4 章的排查思路。
首次成功连接之后,你就能看到一个完整的包列表界面了。左侧通常是可以切换的分类:formula(命令行工具)、cask(图形软件)、服务;右侧是选中项目的详情信息。到这里,工具已经跑起来了。
3. 核心功能实操:我日常是怎么用 BrewUI 的
3.1 包列表和状态一眼清
打开包列表之后,第一眼看到的是本机所有已安装的 formula 和 cask。每一条会显示版本号、安装时间、包体积、是否过期等信息。
我最初用 BrewUI 清点环境的时候,发现了一个很有意思的现象:我明明感觉自己只装过十几个软件,但列表里列出来的 formula 有 37 个,cask 有 21 个。多出来的部分全是依赖项——装一个 Python 开发环境,会顺带拉进来十几个底层库;装一个媒体处理工具,又会带进来一堆编码库。这些包不是用户主动安装的,但它们真实占着磁盘空间。
在终端里看brew list时,这些包混在一起,很难分清“哪些是我主动装的、哪些是依赖”。而在 BrewUI 里,包列表会标记每个包是被主动安装的还是被依赖引入的。这就为后续清理提供了依据。
日常巡检时我喜欢按“体积”排序,从大到小扫一遍。看到某些几个月没更新、又没什么功能用途的巨型包,就会点进详情确认一下它是否还被其他包依赖。如果确认是“孤立”的,就可以放心清理。
3.2 升级更新:别再纠结那条命令
Homebrew 的升级体系分三个层次,很多人容易混淆:
| 操作 | 命令 | 影响范围 |
|---|---|---|
| 检查更新 | brew update | 更新 Homebrew 自身的索引和 formula 列表 |
| 升级全部 | brew upgrade | 升级所有过期的 formula 和 cask |
| 升级单个 | brew upgrade 包名 | 只升级指定的包 |
BrewUI 把这三个层次都搬到了界面上。“检查更新”相当于执行了brew update并展示所有可升级的包;点击升级时可以全选,也可以只勾选你想更新的几个包。
我的习惯一直是“克制升级”。假设一次性升级 30 个包,一旦某个包出现不兼容问题,你很难定位是哪一次升级引入的。使用 BrewUI 之后,我通常会先看一遍可升级清单,把不着急升级的包排除,只挑那些涉及安全修复、或者明确需要新功能的包来升级。这种“选择性升级”在命令行里要手动拼命令,在界面上只需要取消几个勾选,体验差距很大。
另外要注意“升级 cask”和“升级 formula”是两种不同的场景。formula 是命令行工具,升级通常不会影响你正在运行的服务;cask 则对应日常使用的图形软件,升级可能改动应用本身的数据格式。除非确认新版没问题,否则我一般不会一次性升级全部 cask。
3.3 依赖树:理清“装了这个为什么会带那个”
这是我最看重的功能之一。
Homebrew 的依赖关系可以用一张网来形容:一个包装进来,可能附带几十个依赖;这些依赖又可能被其他几个包共用。以前我在终端里查依赖时,brew deps --tree 包名输出的树结构又长又乱,遇到关系复杂的包,眼睛根本看不过来。
BrewUI 把依赖关系做成了可视化的树状图,同时展示两个方向:这个包依赖谁,以及谁依赖这个包。
举个例子,我安装 ffmpeg(一个音视频处理工具)时,带进来了 x264、x265、libvpx 这一堆编码库。以前我只知道“ffmpeg 很庞大”,但不知道它为什么庞大。在依赖树里看到这条链路后,才算真正理解了 Homebrew 的依赖模型。
这个功能在卸载时价值尤其大。删一个包之前,先看看有没有其他包还在依赖它。如果贸然卸载一个被多方依赖的核心库,可能导致一大片软件运行异常。BrewUI 在检测到这种情况时会给出提醒,而不是简单执行命令,这就减少了误操作的概率。
3.4 服务管理:轻量版的进程控制台
Homebrew 的服务管理能力,对应brew services系列命令。它管理的服务通常是后台常驻进程,比如本地 MySQL、Redis、PostgreSQL、Nginx,或者某些开发时需要的守护进程。
终端里的操作长这样:
brew services list # 查看服务状态 brew services start mysql # 启动服务 brew services stop mysql # 停止服务 brew services restart mysql # 重启服务BrewUI 把这些操作映射到了界面上,启动、停止、重启都只要点一下按钮。同时会显示每个服务当前是 running 还是 stopped,以及是否设置了开机自启。
这里有一个实际使用心得:brew services start和brew services run是有区别的。start会把服务注册为开机自启项,而run只会在当前会话运行,注销或重启后就没了。BrewUI 界面上如果区分了这两个动作,建议先确认清楚,不要点完发现电脑重启后服务还在默默占用端口。
我没有在 UI 里把所有服务都点一遍“启动”的坏习惯。常驻服务越多,系统启动越慢,内存占用也越高。通常我会保持数据库类的服务为启动状态,开发用的临时服务随用随启,用完之后就停掉。这项检查我会放在每个季度做一次,停掉那些已经不再使用的自启动服务,效果立竿见影。
3.5 清理与卸载:给磁盘喘口气
磁盘空间不足时,清理 brew 缓存和旧版本是一件非常解压的事。
Homebrew 在安装和升级过程中会留下很多临时下载文件,默认缓存目录在~/Library/Caches/Homebrew(macOS)。日积月累,这个目录动辄几个 GB。终端里有brew cleanup可以清理,但它的输出只是几行“清理了多少文件”的信息,感受不到具体释放了多少空间。
BrewUI 会把缓存体积、旧版本数量直接以数字形式摆出来。你可以在里面看到“当前缓存占用 1.8GB”“有 5 个旧版本可以清理”之类的具体提示,清理操作前能明确知道收益是多少。
卸载方面,BrewUI 同样显示了每个包的体积和被依赖情况。执行卸载前,它会根据依赖关系提示“这个包正被 xxx 依赖,确定要卸载吗”。对于清理长期不用的软件,这个功能相当可靠。
我自己有一次在界面里发现,电脑里残留了 6 个不同版本的 Node.js 相关环境,都是升级历史留下的。清理之后,缓存加上旧版本,一共释放了 2.3GB 空间。这个体量,如果不是可视化呈现,光靠终端命令,我可能根本不会去在意。
4. 常见问题与排查技巧实录
4.1 “连不上本机 brew 环境”怎么处理
这是刚装完 BrewUI 后最容易遇到的问题之一。现象是:应用打开后提示找不到 brew,或者包列表一直空白。
排查思路很简单:先在终端确认which brew的完整路径,然后看这个路径是否在应用的设置里被正确配置。常见原因是 GUI 应用从 Finder 启动时不会加载~/.zshrc或~/.bash_profile里设置的 PATH,因此即使终端里一切正常,应用也找不到命令。
解决方式就是手动填写绝对路径。要特别说明的是,即使你已经用路径填上了,也未必立刻就生效,有时需要重启一次应用,让它重新加载环境。这个重启动作经常被忽略,结果就是改完路径发现还是不好用,误以为是配置方法不对。
4.2 界面一直转圈 / 数据加载不出来
这种情况多半是brew update卡住了。BrewUI 在启动或执行“检查更新”时,需要联网获取最新索引。如果你的网络环境访问 Homebrew 官方源比较慢,界面就会一直停在加载状态。
排查时先回到终端,手动执行一次brew update,观察它能否正常跑完。如果终端里也跑不动,说明是网络问题,和 GUI 工具无关。这种情况一般通过更换网络环境,或者按照 Homebrew 社区的主流做法配置一个访问速度更快的软件源地址来改善。
如果终端里跑brew update很快,但 BrewUI 里仍卡住,大概率是应用自身的状态异常。可以先退出 BrewUI,再重新打开,多数情况能自愈。
4.3 与终端操作冲突:锁文件与并发问题
BrewUI 虽然是个独立应用,但底层还是贯穿 Homebrew 的机制,所以会受 Homebrew 自身锁机制的影响。如果用户在终端里执行brew install的同时,BrewUI 也在执行某个操作,终端里经常会出现这样一行提示:
Another active Homebrew process is already in progress这句话的意思是 Homebrew 的更新锁还在被另一个进程占用。多数情况下等待当前操作完成即可。
如果等了很久还提示锁占用,可能是之前某个 brew 进程异常退出,留下了残留进程。这时候在终端执行:
ps aux | grep '[b]rew'看看有没有残留的 brew 进程,确认无误后用kill终止掉再重试。我在实际使用中很少遇到这种情况,但一旦遇到,不要直接去删 Homebrew 目录下的锁文件,先确认没有进程在跑,再考虑清理。
4.4 误操作怎么回滚
界面操作比命令行更顺手,但也更容易“手滑”。常见场景是:某次点了“全部升级”,升级完之后某个软件开始工作异常。
BrewUI 本身没有“撤销”按钮,但所有操作都记录在 Homebrew 的行为里,我们可以回到终端补救。如果某 package 的新版本有问题,需要装回旧版本,可以用类似这样的命令安装指定版本(具体语法取决于该软件是否提供了版本化 formula):
brew install 包名@版本号如果 Homebrew 官方已经清理了旧版本记录,那可能需要从该工具的 GitHub 历史版本直接下载,或者降级相关依赖环境。
我最想强调的还是预防:升级操作前,先在 UI 里看清楚哪些包会受影响,再决定是否执行。每周升级一次关键包,好过每个月一次性升级几十个包。依赖关系越复杂,批量升级的风险就越难预估。
4.5 常见问题速查表
| 问题现象 | 可能原因 | 处理建议 |
|---|---|---|
| 启动时提示找不到 brew | PATH 未继承到 GUI 环境 | 在设置里填绝对路径,然后重启应用 |
| 数据加载转圈 | brew update卡在网络请求 | 终端手动执行brew update排查 |
| 升级后软件异常 | 包版本兼容性问题 | 用指定版本安装旧版,或回滚依赖 |
| 终端提示 brew 进程占用 | 之前有任务未结束 | 查看残留进程,确认后 kill |
| 更新列表为空 | 仓库索引未更新或网络不通 | 先执行brew update,再刷新界面 |
5. 日常使用心法:GUI 和命令行如何分工
5.1 这个界面最大的价值不是“替代终端”
很多人第一次看到 BrewUI,会下意识说“这玩意不就是把终端包装了一下吗”。我觉得这个判断只对了一半。
命令行擅长的是“精确控制”和“批量执行”,而图形界面擅长的是“信息呈现”和“状态概览”。BrewUI 最大的价值不是让你少敲几条命令,而是让那些原本隐藏在各种brew子命令角落里的信息变得可见。
包体积、依赖关系、服务状态、缓存占用、可升级数量——这些数据一直存在,只是终端里不够直观。当一个信息长期处于不可见状态,你自然也就不会关注它。BrewUI 通过可视化的方式把这些数据重新拉回到你的视野里,让你对这台机器的软件环境更有掌控感。
5.2 我推荐的一套例行检查动作
我自己已经形成了一套固定节奏,分享出来供参考:
- 每周:打开 BrewUI,看一眼“可升级列表”。只升级那些涉及安全修复或者明确需要新功能的包,其他包保持原样。
- 每月:看看依赖树,重点检查安装过的几个大型工具,确认它们没有悄悄引入大量无用依赖。
- 每季度:检查服务列表,停掉不用的自启动服务。看看缓存体积,执行一次清理,给磁盘腾空间。
这套节奏不激进,也不会花太多时间。每次我在 BrewUI 里完成这些操作后,都会对这台机器的状态更有数。
5.3 给新手的建议
如果你是第一次接触 BrewUI,有几件事值得提前知道:
第一,不要为了升级而升级。软件包更新确实会带来新功能,但也可能引入不兼容。稳定能用的软件,没必要天天追新。
第二,升级前先看依赖链。特别是大型工具,依赖关系复杂,批量升级前花十秒钟看一眼依赖树,能避免很多麻烦。
第三,保持 Homebrew 本身是最新版本。BrewUI 调用的是 Homebrew 的接口,如果 Homebrew 版本太老,可能出现数据格式不兼容、功能按钮异常等问题。在终端里执行brew update之后,再打开 BrewUI,状态会比较稳。
第四,把 BrewUI 当成观察工具,而不是万能工具。安装软件、写脚本、自动化操作,还是终端更擅长;观察状态、清点环境、排查依赖,用 BrewUI 更省力。
我自己在使用过程中最大的感受是:工具本身不复杂,复杂的是环境里那些因为长期疏于清理而积累出来的历史问题。BrewUI 让这些问题有机会被看见,也让我在整理软件环境这件事上不再靠感觉,而是看数据。如果你也经常在 brew 里安装各种软件,不妨找个周末把 BrewUI 装起来,认真看一圈自己机器上的包列表和依赖关系——你可能会发现不少有意思的历史遗留,也可能第一次真正搞明白“装了这个为什么会带那个”。