
用了这么多年 macOS 命令行我不止一次想过要是 Homebrew 能像 App Store 一样把已装、可更新、可卸载的软件列成一目了然的列表该多省事。后来我接触到了 BrewUI这个第三方的开源图形客户端算是把这个想法变成了现实。它不是 Homebrew 官方的组件而是社区里有人觉得 Homebrew 的命令行交互不够直观于是做了一套可视化外壳用来管理 formula 和 cask。这篇东西我打算把 BrewUI 的定位、安装、日常使用以及我踩过的几个坑一次性讲清楚给同样依赖 Homebrew 又想偷个懒的朋友参考。先说结论BrewUI 不是要替代终端它只是个更好看的操作面板。底层依旧在调用 Homebrew 的命令行工具所有行为逻辑都能在终端里找到对应的命令。理解了这一点后面很多“为什么界面上的状态和我终端里看到的不一样”这类问题就都能想通了。1. BrewUI 是什么以及我为什么需要它1.1 命令行管理 Homebrew 的痛点Homebrew 是 macOS 上最主流的包管理器装软件、卸载软件、查看依赖一行命令搞定。但它的输出信息量很大尤其是brew outdated、brew info、brew list这些命令满屏的版本号、依赖树、路径信息文字密密麻麻检索效率很低。我平时管理十几个 CLI 工具再加若干桌面应用更新时得手动敲一遍brew upgrade更新完还想看看哪些依赖被跟着升级了又得翻日志。久而久之我对终端里那堆灰色小字产生了疲劳感。虽然也可以配置别名、写脚本来自动化但一个独立的图形界面显然更适合快速浏览和操作。尤其当你想批量选择升级某些包而不是全部升级时图形界面的勾选框比在终端里逐个敲包名要友好得多。1.2 BrewUI 的设计思路与工作方式BrewUI 本质上是一个用 SwiftUI 写的 macOS 应用它把brew list、brew search、brew info、brew install、brew uninstall、brew upgrade、brew cleanup这些命令的结果解析后展示在列表里然后通过用户点击按钮来组装并执行对应的命令。官方 Homebrew 一直坚持“No GUI”的设计理念把所有功能都留在 CLI 里。BrewUI 这类工具则是在这个 CLI 之上加了一层“翻译”。它不修改 Homebrew 的数据也不接管依赖解析所有事情都委托给brew命令。因此它有几个鲜明的特点轻量、无侵入卸载 BrewUI 后 Homebrew 完全不受影响。界面上的每一项操作都是真实命令可以在终端复现。由于要解析命令输出Homebrew 版本升级可能导致临时性兼容问题但一般社区更新很快。如果你已经习惯了命令行BrewUI 可能显得多余但如果你是刚开始接触 Homebrew或者经常需要给别人演示、帮家人朋友管理软件它能降低不少学习成本。我是把那它当成一个“仪表盘”在用大部分操作还是命令行但需要看全局状态、做批量清理时就会打开它。1.3 适合人群分析与使用边界想把 Homebrew 已装软件可视化的用户在列表里按类型筛选比brew list --cask和brew list --formula分开敲要直观。不想背命令的新手安装、卸载、搜索都有按钮减少输入错误。经常需要批量升级软件的重度用户界面里可以勾选多个包一键升级选中的项目。依赖 Homebrew 但又不想被命令行吓跑的普通办公用户比如给 macOS 装一些开源小工具BrewUI 可以替代部分图形安装器的功能。不过它也有边界像brew bundle、brew services这类高级功能在不同版本的 BrewUI 里支持程度不一样有的版本干脆没做按钮。遇到这种情况还是要回到终端。所以我的态度是BrewUI 是辅助工具不是替代品。2. 安装 BrewUI 前的环境准备与两种安装路线2.1 前置条件macOS、Homebrew 与命令行工具BrewUI 是 macOS 专属应用需要 macOS 系统本身能跑 SwiftUI建议至少在 macOS 12 以上。更重要的是你必须已经装好 Homebrew。如果你还没有装先去终端执行那条经典的安装命令装好后再来看这篇文章。另外Homebrew 依赖 Xcode Command Line Tools很多新机型第一次运行brew命令时会提示安装。BrewUI 本身不要求你打开 Xcode但它的底层命令依赖这些工具链。我遇到过用户装了 BrewUI 后点安装包没反应排查半天才发现根本的问题是没有 Command Line Tools终端里连git都跑不了。所以前置检查一定不要跳过。2.2 路线一通过 Homebrew Cask 安装 BrewUIBrewUI 在主线版本稳定之后被收录进了 Homebrew Cask 仓库所以最简单的方式就是执行brew install --cask brewui这个命令会从 Cask 仓库下载最新发布版并安装到“应用程序”目录。装完后你可以在启动台里看到 BrewUI 的图标。这种方式的好处是后续可以用brew upgrade --cask brewui升级和 Homebrew 生态完全统一。我比较推荐推荐小白先用这种方式它干净、标准、容易卸载。不过需要注意Cask 仓库里的版本可能比项目 GitHub Releases 里的最新版慢一些。追求新功能的话看第二条路线。2.3 路线二从 GitHub Releases / 源码安装如果你想要最新体验可以去 BrewUI 的 GitHub Releases 页面下载最新的.dmg文件手动拖进“应用程序”。这种方式适合尝鲜但缺点是无法通过brew outdated自动提醒需要自己关注更新。还有一种方式是拉源码自己编译git clone https://github.com/xxx/BrewUI.git cd BrewUI open Package.swift # 用 Xcode 打开然后选择 Release scheme 编译运行。这个方式适合开发者想改代码或者做二次开发普通用户没必要折腾。我早期用过一阵子源码编译后来发现每次系统升级都要重新编译就放弃转回 Cask 版本了。提示不管哪种安装方式首次打开如果系统提示“无法验证开发者”需要到“系统设置 - 隐私与安全性”里点“仍然打开”。这是 macOS 对未签名应用或新签名应用的常规提醒不是病毒提示。3. BrewUI 首次启动与界面布局拆解3.1 启动后的权限与 Homebrew 路径识别第一次打开 BrewUI它会尝试调用brew命令并读取 Homebrew 的安装目录。如果一切正常它会自动识别出你系统里已装的所有包。这个过程可能耗时一两秒因为底层相当于自动跑了一遍brew list。如果界面提示找不到 brew通常是 PATH 环境变量的问题。在终端里执行which brew看输出路径是不是/opt/homebrew/bin/brewApple Silicon或/usr/local/bin/brewIntel。BrewUI 作为 GUI 应用启动时的 PATH 环境变量与终端不一样它可能读不到你写在~/.zshrc里的配置。此时需要把 Homebrew 的路径加入系统级的 PATH或者直接在 BrewUI 的设置里手动指定brew可执行文件的路径。这个坑我踩过我从终端启动 BrewUI 时一切正常但从 Launchpad 启动就报错后来发现就是 PATH 不一致。解决方法很简单在~/.zshrc里写的那行eval $(/opt/homebrew/bin/brew shellenv)把它也放到~/.zprofile里GUI 应用启动时就能读到。3.2 界面功能分区与操作逻辑BrewUI 的界面布局不同版本可能略有差异但大体上分为四个区域顶部的搜索框与筛选按钮可以按名称搜索筛选显示 formula命令行工具、cask图形应用或已安装/未安装。主列表区展示包名、版本号、最新版本、安装状态、概览信息。右侧详情面板点击某个包显示完整描述、依赖关系、安装路径和可用操作按钮比如安装、更新、卸载。底部的任务输出面板显示当前正在执行的 brew 命令及完整输出日志方便排查问题。每个包旁边的状态标记特别有用。绿色或“已安装”的标签表示已经装好了带“可更新”提示的表示有新版本。你可以点击标签排序先把所有可更新的包筛选出来再勾选需要升级的项。这样比在终端里盯着brew outdated输出的列表要舒服得多。注意BrewUI 里的“更新”按钮对应的是brew upgrade命令不是brew update。brew update是更新 Homebrew 自身brew upgrade才是升级那些包。两者千万别搞混。BrewUI 通常也会提供“更新 Homebrew”的单独按钮位置一般在设置或左下角。4. 日常使用场景下的核心功能实操4.1 搜索并快速了解一个包是否值得安装以前我查询一个包要么用浏览器搜官网要么用brew info看两三屏的输出。用 BrewUI 后直接在搜索框输入名字列表会实时过滤。点开后右侧面板显示这个包的维护者、软件主页、描述和依赖比终端输出更易读尤其对新手很友好。比如我想装neovim搜索后能看到它的最新版本、是否与当前系统兼容、依赖了哪些底层库。如果看到依赖列表里有一堆我不认识的名字可以考虑是不是有更轻量替代品。这比盲目在终端执行安装命令要稳妥不少。4.2 安装与卸载图省事的正确姿势在 BrewUI 里安装一个包非常简单搜索到目标包后点右侧的“安装”按钮。此时底部面板会实时显示终端命令和输出。你可以看到它实际上执行了brew install 包名。对于 cask 应用则会执行brew install --cask 应用名它会自动下载.dmg或.pkg并安装到“应用程序”。卸载操作对应brew uninstallBrewUI 同样会把命令完整打出来。和官方一致卸载 formula 时它会保留依赖并不会自动清除不再需要的依赖包。所以卸载完几个大包后通常还需要执行清理操作。4.3 批量升级与延迟升级的取舍这是我最常用的功能。点顶部的“已过时”筛选可以查看所有可升级的包。这时每个包旁边会有一个复选框你可以全部勾选也可以只勾选几个。点击“升级所选”后BrewUI 会把所有选中的包名拼到brew upgrade命令后面依次执行。这里有一个非常实用的经验不要在勾选时“全选然后直接升级”。如果某一次 Homebrew 的依赖变动较大一下子升级所有包可能会导致某个服务不正常。我通常的做法是先筛选出所有可升级的包。浏览详情把有 major 版本跳跃的包挑出来单独升级。其余版本号仅小版本变动的包批量升级。这样可以避免同时发生多个 breaking change 时难以定位是哪个包引起的。BrewUI 的勾选机制让我在升级前可以逐个查看变更比在终端里盲敲brew upgrade要可控得多。4.4 清理与依赖分析顺手做的事情维护性最好Homebrew 使用久了会产生很多旧版本和缓存安装包# 对应 BrewUI 里的“清理”按钮 brew cleanup -vBrewUI 会把旧的版本压缩包和不再需要的缓存清理掉。定期执行一次能释放几个 GB 空间是很常见的。另外BrewUI 会在包的详情面板显示“依赖”和“被依赖”关系。比如我想卸载python3.11但是发现有很多其他包依赖它这时候就需要谨慎。图形界面把这种依赖链表现得很直观比在终端里一次次brew deps查要省力。4.5 Tap 仓库管理与镜像源调整Homebrew 除了官方核心仓库还能添加第三方 Tap。在 BrewUI 的“仓库管理”区域可以查看所有已添加的 Tap 源也能新增或移除。这对应的是brew tap命令。例如我想添加一个包含夜间版软件的仓库只需要输入仓库地址即可。镜像源调整也在这里操作。由于网络原因有些朋友会把 Homebrew 默认源换成国内镜像。但我要提醒一句BrewUI 并不会替你修改源它只是显示命令结果。如果你已经用终端设置过镜像源BrewUI 查到的更新数据和镜像完全一致。反过来如果你在 BrewUI 里看到一个包很久没更新先回到终端执行brew update更新 Homebrew 自身的索引再回来看。5. 使用 BrewUI 时遇到的典型问题与排查技巧5.1 “无法识别 brew 路径”或“找不到 Homebrew”这个是最常遇到的问题。BrewUI 在执行命令时需要找到brew可执行文件。很多时候从 Launchpad 启动 App它继承的是系统级 PATH而不是终端里的 PATH。解决办法是确认 Homebrew 安装路径后在 BrewUI 的设置里手动指定/opt/homebrew/bin/brew如果找不到设置项可以先把 Homebrew 的 shellenv 配置写到~/.zprofile然后重启系统或杀掉 Dock 进程让 GUI 环境下也能加载这个配置。5.2 安装、升级时报错“Permission denied”这个通常与 Homebrew 所在目录的权限有关。如果你在终端里执行brew install时没问题但 BrewUI 里报权限错误多半是因为应用没有完整磁盘访问权限或者 Homebrew 目录的属主不是当前用户。排查方法ls -ld /opt/homebrew如果属主不是你的用户名执行sudo chown -R $(whoami) /opt/homebrew但我建议谨慎执行最好先确认目录是否属于系统管理的多用户场景。正常个人电脑上Homebrew 最好由当前用户持有避免权限混乱。5.3 界面显示的已安装列表与终端不一致这种情况一般是因为 Homebrew 的缓存没有更新。BrewUI 解析的是brew list的输出如果你之前在终端手动安装了包回到 BrewUI 后可能需要手动刷新一下列表或者点击“重新扫描”。反过来你用 BrewUI 安装了包终端里立刻就能看到因为它是真实调用 brew。所以界面列表“旧”不代表软件有问题先确定缓存最后刷新的时间就好。养成使用后顺手刷新的习惯能避免后续误操作。5.4 升级某个包后系统提示“仍使用旧版本”这是 Homebrew 的常见模式不是 BrewUI 的 bug。许多 formula 安装的是二进制文件升级后当前 shell 可能还在使用旧路径。退出终端重新打开或者执行hash -r清理 shell 命令缓存。如果还不行检查/usr/local/bin或/opt/homebrew/bin里的软链接是否指向了错误版本。5.5 卸载后残留的依赖检查BrewUI 卸载包时只会执行brew uninstall不会自动清理依赖。很多用户卸载一个应用后发现磁盘没减少多少就是因为依赖还在。我建议在卸载后使用brew autoremove来删除不再被需要的依赖包BrewUI 的“清理”功能通常也会包含这个动作关键是确认你的版本是否有这个按钮。如果没有老实回终端执行brew autoremove brew cleanup5.6 网络问题导致的下载卡住BrewUI 下载安装包和终端下载一样依赖网络如果镜像源设置不当点击安装会长时间停滞。可以看底部任务输出里卡在哪一步如果一直卡在 “Downloading”大概率是网络原因。试着在终端执行brew update看是否正常。如果也不正常检查代理设置和 DNS。记住BrewUI 没有独立的网络通道它完全依赖 Homebrew 的下载能力。6. 我对 BrewUI 的几个主观评价与使用建议6.1 它适合作为 Homebrew 的“仪表盘”我现在的日常工作流是终端里照常brew install装新软件等需要升级时打开 BrewUI快速浏览有哪些过时包根据详情决定是否批量升级再顺手清理一下缓存。整个流程比纯命令行版本直观多了重点是我可以一眼扫过所有包的状态不会漏掉一些冷门工具的更新。6.2 不建议什么都依赖图形界面如果你刚开始学 macOS 开发或者运维相关技能我还是建议先把终端的常用 brew 命令练熟。因为 BrewUI 再怎么友好它也只是一个前端封装最终还是要和命令行打交道。遇到 CI 环境、远程服务器、Docker 容器这些没有图形界面的场合你还是得靠终端。把 BrewUI 当成“可视化辅助”而不是“救命稻草”心态上会健康很多。6.3 让人惊喜的小细节操作日志透明BrewUI 值得称道的一点是“对底层操作的透明”。它不会默默在后台做任何事所有操作都在底部面板打印出真实命令。这让我这种习惯命令行的人有安全感。你可以把它理解成一个“图形化命令生成器”点按钮的同时学会了对应命令对新手来说反而是种学习方式。6.4 后续还能怎么扩展如果你的需求不止于管理包可以关注 BrewUI 的配置项。部分版本支持brew services的启动/停止管理可以在界面上直接操作后台服务比如 MySQL、Redis 这类需要常驻的服务。另外如果你配合brew bundle使用可以通过命令行导出已装清单然后在另一台机器上通过 BrewUI 可视化查看差异。我个人建议把 BrewUI 和brew bundle的文件放在同一个目录每次装完新软件后顺手在终端执行brew bundle dump把清单更新一下。这样即使换了台电脑也能快速复现你的全套工具链。最后分享一个我自己的小习惯每次升级系统大版本前我会先打开 BrewUI把所有包升级到最新顺便做一次清理再用终端执行brew doctor检查一遍。这些年 macOS 升级后的各种依赖问题我基本都没怎么踩过提前更新很重要。说到底BrewUI 让 Homebrew 的使用门槛低了不少但它真正解决的还是“可视化管理”这件事该理解的依赖关系、该注意的升级策略一样都不能少。如果你已经装了 Homebrew又不喜欢整天盯着终端里的文字列表不妨装个 BrewUI 试试也许它会成为你管理 macOS 软件的新入口。