BrewUI:给Homebrew套上图形界面,可视化包管理与服务监控
2026/9/20 10:26:52 网站建设 项目流程

如果你也是 macOS 用户,大概率绕不开 Homebrew。日常装个 nginx、升级一下 python、清理几个老包,基本上都是在终端里敲brew installbrew updatebrew upgrade这几板斧。命令本身不难背,但当你机器上装了上百个包、需要搞清楚某个工具到底是哪个依赖带进来的、或者想快速重启一个后台服务的时候,纯靠命令行来回折腾确实有点心累。BrewUI 就是我在这种情况下开始用的一个开源工具,它给 Homebrew 套了一层图形界面,把包列表、依赖关系、更新升级和服务状态直接可视化。这篇文章我会把 BrewUI 是什么、值不值得用、怎么装、有哪些坑,从头到尾讲一遍,整个过程都是我实际跑过的,不是纸上谈兵。

1. 为什么要把 Homebrew 的命令行改成图形界面

1.1 命令行 Homebrew 的四个真实痛点

先说说我自己的处境。我平时工作要同时维护好几个项目,有的项目依赖 node 14,有的要 python 3.9,还有的要 mysql、redis、nginx 这些常驻服务。Homebrew 在这些场景下确实很能打,但越用越会发现几个问题。

第一个痛点是包多了以后,记忆成本直线上升。brew list一刷就是几十行,可能你只是想找一下某个命令行工具当时装到哪个目录了,却要在茫茫列表里靠眼睛去扫。brew info虽然能查详情,但你首先得记得名字,记不住名字的时候,终端里的搜索体验非常原始。

第二个痛点是更新和升级像开盲盒。brew upgrade一下会把所有能升的都升了,但你根本不知道这次升级会连动多少依赖。有时候我只是想给某个包打个补丁,结果 upgrade 完,项目跑不起来了,回头一看,某个底层库被悄悄换成了新版本。

第三个痛点是服务管理不直观。brew services start mysqlbrew services list这些命令本身不复杂,但状态信息只有启动、停止、重启这些文字反馈,具体哪个服务在跑、哪个挂了、日志长什么样,都需要额外再敲命令去查。

第四个痛点是依赖关系图没法一目了然。brew deps --tree这个命令输出一个树状图,但终端里那个树在包一多的时候就疯长,水平滚动 + 缩进,看着真的头大。我一直觉得,这类信息天生适合用图形化来呈现。

1.2 BrewUI 解决了什么问题,又没打算解决什么

BrewUI 并不是要把 Homebrew 完全替代掉,它的定位非常明确:做一个本地的、带界面的 Homebrew 操作台。你打开它,左侧是分类导航,中间是包列表,右侧是包的详情面板。安装过的 formula 和 cask 分得清清楚楚,哪些可以升级、哪些是独立安装的、哪些是被别的包拉进来的,列表里一眼就能看出来。

它解决的,主要是上一节说的那几个高频场景:浏览已安装包、搜索仓库里的可用包、查看包的依赖关系、执行安装和卸载、检查更新和执行升级、管理 brew services。这些操作在命令行里都能做,但 BrewUI 把它们变成了一次点击的事。

但它没打算解决脚本化问题。如果是一次性要在十台机器上装同一组开发环境,或者要在 CI 流程里自动化处理依赖,BrewUI 这种图形工具完全使不上劲。它适合的是人坐在电脑前、手动管理这台机器上的软件包这种场景。

我个人的感受是,BrewUI 更适合两类人。一类是刚开始接触 macOS 开发、对终端还不够自信的新手,图形界面能大大降低心理门槛。另一类是已经对命令行很熟的老手,用它来快速浏览、排查问题、管理服务,能省掉很多重复敲命令的时间。

1.3 同类工具对比:为什么最后选了 BrewUI

不是只有 BrewUI 想到了给 Homebrew 做图形界面。我先列一下我用过或者关注过的几个工具,再做对比。

工具维护状态主要特点
Cakebrew已基本停滞早期的 Homebrew GUI,功能全但界面老,兼容性一般
Brewlet还在更新菜单栏小工具,主打状态查看和快速更新,没有完整管理能力
Homebrew-GUI社区项目偏极客向,配置项多,但使用起来不那么顺手
BrewUI活跃界面现代化,依赖关系分析和服务管理集成度高

Cakebrew 算是前辈,功能逻辑和 BrewUI 很像,但界面确实过时了,而且新版本 macOS 上偶尔会出现显示异常。Brewlet 我把它放在菜单栏里当状态监控用,看看有几个包可以升级,但它的功能太轻,连依赖关系都看不了。Homebrew-GUI 功能强,但对普通用户不够友好,配置得自己改文件。BrewUI 是我目前的主力,原因有三个:界面干净、依赖视图做得清楚、brew services 直接集成在侧边栏里,不用在多个窗口之间来回切。

注意:这类第三方 GUI 工具更新节奏不同,你看到的功能版本可能和本文不完全一致。重要的不是某个按钮的位置,而是它背后对应的 Homebrew 操作逻辑,这个逻辑是通用的。

2. BrewUI 核心功能详解:安装、升级、清理与依赖分析

2.1 千万要分清楚的 Formulae 和 Casks

用 BrewUI 之前,有一个基础概念必须掰扯清楚:Homebrew 里的包分成两种,Formulae 和 Casks,它们的管理逻辑不太一样。

Formulae 是命令行工具和开发库,比如 git、wget、nginx、python,这类东西在终端里跑,用brew install安装,安装后直接进入/opt/homebrew或者/usr/local目录。Casks 是图形化应用,比如 Google Chrome、Visual Studio Code、Notion,它们本质上是 Homebrew 帮你从官网下载一个.dmg或者.pkg,然后装进/Applications目录,用brew install --cask安装。

在终端里,你一旦装多了就会分不清某个包是 formula 还是 cask,特别是偶尔写错命令,cask 被装成了 formula,最后留下一个不能运行的残体。BrewUI 在界面上把这两类分成了两个页签,formula 归 formula,cask 归 cask,状态一目了然。这一点对新手特别友好,至少不会因为搞不清分类而装错东西。

我当时踩过的坑是,在终端里用brew install chrome装浏览器,结果它把 Chrome 当成一个不存在的 formula 处理,报错之后还要自己手动清理。后来在 BrewUI 里搜索 chrome,它会明确显示这是 cask,并且区分出各个发行版本渠道,这种歧义问题就很少出现了。

2.2 依赖关系可视化,比 brew deps 直观太多

BrewUI 的依赖关系图是我最常用的功能之一。点开任意一个包,详情面板里会列两样东西:这个包依赖了哪些包(dependencies),以及这个包被哪些包依赖(dependents)。

这个功能拿来排查环境问题特别有效。举个例子,我之前遇到一个项目启动报错,说缺了某个动态库。正常思路是上网搜、然后brew install那个库。但更合理的做法是先看看这个库是不是本来就存在于系统里,只是因为版本不对才导致问题。在 BrewUI 里打开项目直接依赖的那个顶层包,往下一层层看依赖树,很快就能找到被升级过的底层库,问题往往就出在那。

依赖关系可视化还有一个好处,就是卸载的时候心里有底。终端里的brew uninstall只能卸载你指定的包,不去管它留下的依赖。时间长了,系统里会积累一堆没人需要的孤立包。BrewUI 的列表里会标出哪些包是"独立安装的"(installed on request),哪些是"作为依赖被带进来的"(installed as dependency)。清理的时候就按这个标记来筛选,先处理那些不再被任何包依赖的依赖项,系统能清爽不少。

提示:想要清得快,记住一条原则——先确认没有其他包还依赖它,再执行卸载。界面上专门有过滤条件,可以只看"已无依赖方引用的包",这是最稳妥的清理入口。

2.3 升级操作的隐藏风险与可控操作

升级是 Homebrew 操作里最容易翻车的地方。终端里一条brew upgrade下去,它会扫描所有已安装的包,能升的全都给你升一遍。听起来很方便,但问题是,你并不清楚这次升级到底会影响什么。

BrewUI 的升级策略更保守,也更贴近实际使用习惯。它把"可更新的包"单独列出来,你可以逐个查看每个包的新版本说明,以及它的依赖关系,然后决定升哪个、跳过哪个。对于重要的开发运行时,比如某个特定版本的 Node.js 或 Python,我一般会先看看它的依赖树会不会跟着变,再决定要不要更新。

还要提醒一点,brew upgradebrew update是两回事。update 是更新 Homebrew 自身和它的包索引,upgrade 才是去升级那些已安装的包。BrewUI 里的"检查更新"按钮做的其实是 update 这步,之后列表会把需要 upgrade 的项列出来,这一步很多新手容易混,看到"检查更新"就以为已经升级完了,结果实际包还是旧版本。

升级完成之后,如果某个项目突然跑不起来了,也别慌。在 BrewUI 里找到刚升级的那个包,看它前后的版本变化,必要时卸载新版本,再用旧版本安装。这种"可控的回滚流程",在纯终端里操作起来比较绕,但在图形界面里顺着包列表操作,思路清晰很多。

2.4 服务管理:把 brew services 也收进界面

Homebrew 有个子命令叫brew services,负责管理通过 formula 安装的后台服务,比如 mysql、postgresql、redis、nginx。终端里你只能看到三五行的状态输出,启动、停止、重启都要敲对应的命令。BrewUI 把这块也收进了侧边栏,所有服务以列表方式展示,左上角直接显示当前是 running 还是 stopped,旁边就是操作按钮。

我在实际使用中,最常用的一个场景是改完配置文件后重启 nginx。以前的操作流程是:打开终端,敲brew services restart nginx,还要回头看有没有报错。用 BrewUI 就是找到 nginx,点一下重启,几秒钟后状态从"正在启动"变回 running,整个过程能看到实时日志输出,比终端里干等反馈要安心很多。

有一点要专门说清楚:BrewUI 管理的服务范围,和brew services是一样的,只管理那些通过 Homebrew 安装并且注册到 launchd 的服务。你自己从源码编译、手动起的进程,或者 Docker 容器,它是看不到的。所以在用 BrewUI 之前,先确认目标服务确实是通过 Homebrew 装的,不然你在界面里找不到它,还会以为工具坏了。

3. 从零上手:安装 BrewUI 并完成第一次操作

3.1 安装前的环境自检

在装 BrewUI 之前,先确认两件事。第一件,你的 macOS 版本是否满足项目要求。BrewUI 这类桌面应用一般会标注最低系统版本,大部分现在要求 macOS 11 以上,太老的系统可能装不上或者界面显示异常。第二件,Homebrew 本身必须是正常工作的状态。

打开终端,执行这几条命令,一条一条确认:

brew --version brew doctor brew list | head -20

brew --version正常输出版本号就说明 Homebrew 本体在。brew doctor会检查环境里的潜在问题,它会提示一些比如"unbrewed dylibs were found"或者"Homebrew's prefix was not writable",这些其实是在告诉你环境可能有坑,最好先解决再继续。brew list能正常列出包,说明 Homebrew 的本地索引可用,BrewUI 装完才能读到数据。

如果你还没装 Homebrew,那第一步是先把 Homebrew 装上。官方页面上有安装命令,形式上是把一段脚本拉下来执行。我的建议是执行前先 curl 下来看一眼脚本内容,确认里面做的事你都能接受,再跑安装。具体安装命令以官方文档为准,这里就不贴完整脚本了。

提示:环境自检这一步别跳过。我遇到过好多次,BrewUI 打不开或者列表刷不出来,最后排查来排查去,根因是 Homebrew 本身的目录权限坏了,和 BrewUI 一点关系都没有。先把地基夯实,再盖楼。

3.2 两步完成 BrewUI 安装

BrewUI 的安装方式,和大多数 macOS 桌面应用一样,通常有两种途径。

第一种,如果项目提供了 cask 配置,你可以在终端里一条命令搞定:

brew install --cask brewui

这条命令会把 BrewUI 安装到应用程序目录。不过要说明一下,第三方的 cask 配置并一定都会被 Homebrew 官方 cask 仓库收录,如果没有被收录,这条命令会报错找不到包。遇到这种情况,就走第二种方式:去项目的 Releases 页面下载最新的.zip或者.dmg安装包,手动安装。下载完成后,如果是.zip,双击解压,然后把 BrewUI.app 拖进 Applications 文件夹;如果是.dmg,双击挂载,同样把应用拖进 Applications 文件夹。

安装完成后有一个很常见的坎:首次打开时 macOS 提示"无法验证开发者"或者"已损坏,无法打开"。别慌,这不是应用真的坏了,而是 Gatekeeper 的签名检查机制在拦截。处理方式有三种:

第一种,右键点击 BrewUI.app,选择"打开",在弹窗里确认打开。第二种,如果还不行,到"系统设置-隐私与安全性"里,最下面一般会有"仍要打开"的提示。第三种,在终端里手动移除隔离属性:

xattr -cr /Applications/BrewUI.app

-c表示清除所有扩展属性,-r表示递归处理目录内所有文件。这是大多数从 GitHub Releases 下载的开源应用的通用解法。

注意:这里有个操作性很强的原则——你下载应用最好只从项目官方 GitHub Releases 页面拿,不要从第三方下载站拿。第三方站点重新打包过的应用,内容无法验证,一旦被人塞了恶意代码,你压根发现不了。xattr -cr这种操作相当于主动放行了一个应用,如果应用本身不可信,放行之后再想防御就很难了。

3.3 首次启动:界面布局与加载逻辑

装好以后,第一次打开 BrewUI,你会看到登录界面有一个加载过程。它本质上是在读取本机 Homebrew 的数据库和安装信息,需要扫描/opt/homebrew(Apple Silicon)或者/usr/local(Intel)目录,以及/Applications目录下的 cask 应用状态。所以首次加载通常会有一段时间的转圈,具体多久取决于你装了多少包,几十个包一般几秒到十几秒,几百个包可能需要更久。

加载完成后,界面主要有几个区域。左侧是导航栏,从上到下依次是概览、Formulae、Casks、更新、服务,可能还有日志等分类。中间是主列表区,每个条目会显示包名、当前版本、是否可升级,以及安装方式。右侧是详情面板,展示包的描述、依赖关系、被依赖情况、安装日期、安装位置。最上面是搜索框,可以按名称搜索,对应终端里的brew search

从设计逻辑上看,BrewUI 做的最正确的一件事,就是把"更新"做成了独立页签,而不是让用户自己去列表里比对版本。打开更新页签,所有可升级的包排成一列,每个包后面是当前版本和目标版本,还有一个升级按钮。这种设计非常符合直觉,和手机 App Store 的更新页逻辑一样,几乎没有学习成本。

3.4 实战演示:搜索、安装、卸载一个软件

用一个完整流程演示一下。假设我要在 BrewUI 里安装 nginx。

第一步,在顶部搜索框输入 nginx。结果列表会同时显示 formula 命中和 cask 命中,nginx 的 formula 就是服务端软件本体,cask 如果存在一般是一些客户端工具。现在我们要的是 formula,就点进 formula 那个条目。

第二步,查看详情面板里的依赖信息。nginx 这种包依赖还算简单,它会列出 openssl、pcre2 等底层库,同时显示这些依赖当前是否已经安装。如果没有安装,BrewUI 会提示你安装时会自动带上这些依赖。

第三步,点击安装按钮。此时界面底部会出现一个操作日志面板,实时滚动显示DownloadingPouringLinking这些步骤的输出,和终端里brew install nginx的输出是一致的。安装完成后,nginx 会出现在已安装列表里,同时更新页签可能会多出一些可选项——因为我刚才装 nginx 时顺手带了几个新依赖,如果它们有新版可升,BrewUI 会如实列出来。

卸载的流程也差不多,选中包,点击卸载,BrewUI 会先检查有没有其他包依赖它,如果有会给出警告。比如你装了 postgresql,后来又装了 postgis,这时候直接卸载 postgresql 会导致 postgis 失效,BrewUI 会拦截这个操作并要求你确认。这一点比终端里的brew uninstall做得更安全,终端默认不拦你,命令下去就直接拆了。

4. 实操中的常见问题与排查技巧

4.1 应用打不开、闪退、提示已损坏

先说最常见的:下载 BrewUI 之后双击打不开,提示"已损坏"或者"无法打开,因为无法验证开发者"。这一般不是应用文件坏了,而是 macOS 的 Gatekeeper 限制。解决办法前面已经说过,用右键打开或者执行xattr -cr。执行完再试一次,一般都能解决。

如果你的应用打开之后秒退,先不要急着重装。我遇到过的原因主要是运行环境不兼容。比如 BrewUI 的某个版本要求的最低系统版本比你当前的 macOS 版本高,这种只能升级系统或者换一个更旧的 BrewUI 版本。另一个常见原因是,BrewUI 在启动时连不上 Homebrew 的 socket,这通常不是因为网络,而是因为 Homebrew 本身卡住了。你可以先在终端里跑一下brew list,如果终端也卡住,那说明是 Homebrew 自身的问题,先修复 Homebrew 再开 BrewUI。

提示:遇到"无法打开",先区分两种情况——是第一次打开被拦截,还是以前能用、今天突然闪退。第一次打不开,九成是权限问题;以前能用现在不能用,九成是 Homebrew 环境或者 BrewUI 配置出问题了。排查方向别搞反。

4.2 包列表刷不出来或数据陈旧

BrewUI 打开之后,列表一直是空的,或者显示的包数量和终端brew list对不上。这种情况最常见的原因是 Homebrew 的本地索引和 BrewUI 缓存的索引不一致。

手动在终端里执行一次brew update,把 Homebrew 的包索引刷新到最新,然后重启 BrewUI。如果列表还是旧的,看看 BrewUI 设置里有没有刷新按钮,有些版本是点击"刷新"触发一次重新扫描;如果还没有,那就把 BrewUI 的缓存目录删掉再重启。具体缓存目录位置不同版本不一样,通常在~/Library/Application Support/BrewUI下面,删除前最好备份一下。

还有一种不太常见的情况是,你的 Homebrew 不在默认路径。有些用户会把 Homebrew 装到自定义目录,BrewUI 默认只去默认路径找。如果遇到这种问题,你需要确认这个工具是否支持自定义 Homebrew 路径,不支持的话,这种非常规环境可能就不适合用 BrewUI。

4.3 权限问题导致安装和卸载失败

BrewUI 在执行安装包或者链接文件的时候,本质上是把它看到的操作转发给 Homebrew 后台处理,所以权限问题绕不开。最常见的一个报错是Permission denied @ rb_sysopen,出现在/usr/local目录被 root 占用的情况下。

这种情况通常出现在你以前用sudo跑过brew install,导致一部分目录的所有者被改成了 root。修复方式是在终端里把 Homebrew 目录的所有权归还给当前用户:

sudo chown -R $(whoami) /usr/local

这条命令会把/usr/local下所有文件的所有者改成当前登录用户。注意,Apple Silicon 机器上 Homebrew 前缀是/opt/homebrew,一般不会出现这种权限问题,因为系统设计时这个目录就是给当前用户用的。Intel 机器上/usr/local相对复杂,会和系统自带的一些文件混在一起,执行 chown 之前先确认一下你装 Homebrew 时用的哪个前缀。

另外提醒一句,别为了让 BrewUI 操作成功就去用sudo打开它。图形界面应用以 root 身份运行,一旦它有点 bug,影响范围是整个系统的文件,风险比终端里跑一条 sudo 命令高得多。

4.4 三个日常使用习惯

用了 BrewUI 一段时间后,我总结出几个让这个过程更顺滑的小习惯。

第一个习惯,安装新包之前先在 BrewUI 里搜索一下,看它到底是 formula 还是 cask。别小看这一步,它能避免你把一个图形软件装成命令行工具,或者反过来把命令行工具装到 Applications 里。

第二个习惯,每个月做一次"孤立依赖清理"。打开 BrewUI 的依赖分析视图,过滤出那些没有被其他包引用、也不是独立安装的包,逐个确认后卸载。我一般一个月清一次,清出来的空间大概有几百 MB,系统也清爽一些。

第三个习惯,升级前先截图或者记下关键包的版本。不管用 BrewUI 还是终端,批量升级这种事多少有风险,记录旧版本号是为了在升级出问题的时候,能够快速找到需要降级的包。BrewUI 里可以直接看到每个包的更新历史,结合升级前的记录,回滚操作会非常顺。

5. BrewUI 的边界:什么场景我仍然回到终端

5.1 批量脚本化操作确实还得靠命令行

BrewUI 再怎么方便,也只适合在一个人手动操作一台机器的时候用。如果你要初始化一台新开发机,要装 homebrew、git、node、python、docker、还有一些 cask 应用,这种重复性的环境搭建,写一个脚本批量执行才是正路。我在新机器上就放了一个setup.sh,里面把 brew 命令一条条写好,跑一遍就搞定,这种场景不会去开图形界面一个个点。

另外,如果你在做一些跨机器的自动化配置管理,比如用 Ansible 之类的工具去统一管理开发环境,那 BrewUI 这种图形界面更是完全插不上手。它的作用范围,就是"人坐在电脑前,打开一个应用,图形化地管理这台机器上的软件包"。

5.2 复杂依赖冲突排查还得看终端原文

虽然 BrewUI 的依赖关系可视化做得不错,但遇到特别复杂的依赖冲突,我最终还是回到终端。原因是,终端里的brew doctorbrew config能给出非常底层的信息,比如某个动态库符号冲突、某条路径设置不对,这些信息在 GUI 里很难完整铺开。

举一个具体例子。有一次我遇到brew doctor提示有未清理的旧版本库文件(unbrewed dylibs),BrewUI 里不会显示这种细节,因为它的信息模型是基于"已安装的包"这个抽象层,而那些游离在 Homebrew 管理范围之外的文件是看不到的。排查这类问题,老老实实回到终端,按brew doctor给的提示一步步处理,效率最高。

5.3 我目前的工作流:两边分工合作

现在我的日常处理方式是:用 BrewUI 做巡检和管理,用终端做诊断和脚本化操作。

每天早上打开 BrewUI,先看更新页签,了解有没有需要升级的包;服务页签看一下常驻服务是不是都活着。如果某个项目报错,需要排查依赖问题,我会先在 BrewUI 里快速查看相关包的依赖关系,锁定可疑范围,然后打开终端,用brew infobrew deps甚至直接看/opt/homebrew/opt下面的实际链接状态进一步确认。遇到要批量装环境的情况,直接终端跑脚本,不会在 GUI 里一个个点。

最后再分享一个小技巧。用 BrewUI 做批量升级之前,先点开几个关键包的依赖树看看,确认这次升级不会动到你当前项目正在用的运行时。这个习惯帮我躲过了好几次"升完级项目就崩"的尴尬。你在终端里虽然也能做同样的检查,但说实话,没有可视化界面的时候,你真的会嫌麻烦跳过这一步。BrewUI 的存在,不是让你彻底告别终端,而是让"检查"这个环节变得更轻松,从而帮你养成更安全的升级习惯。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询