做开发这些年,每天都在和命令行打交道,装软件这件事,Mac 用户基本都绕不开 Homebrew。但说句实话,让一个刚接触命令行的人去敲brew install、brew services start,或者去读brew deps --tree那一大串依赖关系,确实有点劝退。我自己用了几年 Homebrew 后,出于好奇试了试一个叫BrewUI的图形化工具,心想这不就是把 brew 命令包了一层壳吗?结果用下来发现还真不是简单套壳,它在包管理、依赖排查、批量操作这些场景里,确实解决了不少痛点。这篇文章就和大家聊聊 BrewUI 到底能做什么、怎么用、有哪些坑,以及我实际体验下来的一些心得。
BrewUI 说白了,就是给 Homebrew 装上一个可视化操作界面。它把平时需要用终端敲的那些命令,翻译成按钮、列表、搜索框和状态面板,让你能用鼠标完成绝大多数软件包管理工作。适合谁用呢?一类是刚接触 Homebrew 的新手,不想一上来就背命令;另一类是像我这样命令行用了很久,但偶尔也想偷个懒的老用户,特别是清理依赖、查看更新、批量操作的时候,图形界面确实比一条条敲命令要直观得多。
1. 项目定位与核心需求拆解
1.1 为什么 Homebrew 需要一个图形界面
先聊聊 Homebrew 本身的处境。它现在是 macOS 上最流行的包管理器,没有之一。你几乎能在上面找到所有开发工具,从 git、node、python 这种基础软件,到 nginx、redis、postgresql 这类服务端程序,再到 visual-studio-code、google-chrome 这种带图标的桌面应用,它都能管。Homebrew 把这些软件分成两大类别:formulae 和 casks。formulae 是命令行工具和库,casks 是图形界面应用。这个设计很巧妙,但问题也随之而来:它太强大了,命令太多。
日常用 brew 的人,真正高频的命令就那么几条:brew install、brew uninstall、brew update、brew upgrade、brew list、brew search、brew cleanup。但 Homebrew 的完整命令集远超这些,还有brew services、brew doctor、brew bundle、brew info、brew deps、brew outdated等等。而且每个命令还有各种参数,比如--cask、--formula、--force、--dry-run、--cleanup。光记住这些就够喝一壶了。
更让人头疼的是输出信息。brew info打印出来的依赖树、冲突警告、注意事项,在终端里是纯文本,没有高亮,没有层级缩进,关键信息要靠眼睛去扫。软件装多了之后,你想知道某个包为什么会被装进来、它依赖了哪些东西、哪些包已经过时,纯靠命令行去查,效率真的很低。
BrewUI 瞄上的就是这部分需求。它把上面说的所有操作,都变成了可视化的面板。左边是软件列表,右边是详情页,点一下按钮就能装包、卸包、升级包,依赖关系用树形图展示,更新状态用颜色标记。用图形界面不是说要取代命令行,而是提供一个降低门槛、提升效率的入口。
1.2 BrewUI 能做什么:软件包管理可视化
我把 BrewUI 的功能梳理了一遍,核心其实就是下面这几块:
- 软件包搜索与浏览:你可以在搜索框里输入包名,它会去 Homebrew 的本地索引和远程仓库里匹配,列出所有相关 formulae 和 casks,以及它们各自的中文描述、版本号、安装状态。
- 软件的安装与卸载:在搜索结果或已安装列表里,点安装按钮即可执行安装;已装的包可以直接卸载。相比命令行,界面会实时显示安装日志,装到哪一步、有没有报错,一眼就能看到。
- 批量升级与更新:BrewUI 会扫描所有已安装的软件包,把有新版本的包标记出来,你可以选择性更新,也可以一键全部更新。这和
brew upgrade的效果一样,但你可以提前看到哪些包会升级到哪个版本,避免盲目执行。 - 依赖关系可视化:安装一个包的时候,它会把整个依赖树展示出来。哪些是自动依赖、哪些是你手动装的,用不同颜色和连线标出,比敲
brew deps清晰得多。 - 服务管理:Homebrew 的
brew services命令可以管理后台服务,比如让 mysql 开机自启。BrewUI 把服务列表也集成进来,启动、停止、重启、设置开机启动,都是开关按钮。 - 清理与诊断:一键运行
brew cleanup来清理旧版本残留,一键运行brew doctor来检查系统环境问题。诊断结果会以列表形式展示,哪些需要处理,哪些只是警告,一目了然。
这些功能单个拿出来都不算复杂,但组合在一起,日常的包管理基本就能脱离终端完成了。
1.3 目标用户与应用场景
我最开始以为 BrewUI 是给小白用的,用了一段时间后发现,它的适用人群其实更广。
- 刚接触 Homebrew 的新手:不想去记命令,也不想在终端里面对一堆英文报错。BrewUI 的界面本身就有引导性,安装、卸载、升级都只要点按钮,降低了不少心理门槛。
- 日常开发的前端、后端工程师:这些人的机器上通常装了大量的开发工具,比如 node、python、docker、nginx、redis。平时升级软件、排查依赖、管理后台服务,用 BrewUI 能省不少事。
- 维护多台电脑的开发者:通过 BrewUI 查看当前机器的完整软件清单,比自己记忆方便得多。哪台机器缺什么工具,打开界面一查就能知道。
- 喜欢对系统环境有全局掌控感的用户:Homebrew 装了很多软件后,清理磁盘空间、查看安装历史、了解依赖关系,这些需求用图形界面来做,体验比终端好很多。
那它不适合谁呢?我只想说,如果你的工作流已经完全建立在命令行的肌肉记忆上,用alias做了很多快捷方式,那 BrewUI 并不是必需品。它更像是一个补充工具,在你想更直观地管理整台机器的时候使用。
2. 安装与运行环境准备
2.1 安装前的环境检查
BrewUI 不是要替代 Homebrew,它本身要运行在已经装了 Homebrew 的 macOS 系统上。所以第一步是确认你的 Mac 上已经具备以下条件:
- macOS 操作系统:BrewUI 目前主要面向 macOS,官方支持较新的系统版本,老版本系统可能会遇到兼容性问题。
- 已安装 Homebrew:终端执行
brew --version,如果能输出版本号,说明已经就绪。如果没装,就得先去命令行装一遍 Homebrew,这个步骤绕不开,因为 BrewUI 只是客户端,真正干活的还是 brew 命令本身。 - 网络环境正常:安装软件包时需要访问 Homebrew 的远程仓库,网络不稳定会影响安装和更新。
建议在安装 BrewUI 之前,先在终端跑一遍brew doctor来预检环境。这是我后来才养成的习惯,一开始因为本机环境有警告没处理,导致 BrewUI 里的诊断面板也是一堆感叹号,看着很闹心。先处理掉brew doctor能查出来的问题,再用 BrewUI 就会干净很多。
2.2 两种安装方式与踩坑记录
BrewUI 的安装方式其实不算复杂,我在一台新 Mac 和一台老 Mac 上分别试过,这里做个对比。
第一种方式是用 Homebrew 本身来装。终端执行brew install --cask brewui,它会通过 cask 通道把应用下载到 Applications 目录。这种方式的好处是,后续升级可以直接用brew upgrade --cask brewui,和你的其他软件统一管理。不过有个前提,就是这个 cask 已经被收录到 Homebrew 仓库中了。我第一次尝试的时候,执行命令直接报错,提示找不到这个 cask。这种情况要么是本地索引太旧,需要先brew update,要么是这个应用还没被官方仓库收录,得自己手动处理。
第二种方式是直接从项目的 GitHub Releases 页面下载 dmg 文件。下载后把应用拖入 Applications 目录就行。这种方式适合官方仓库还没收录、或者更新速度跟不上的情况。但缺点也很明显,后续升级要自己手动下载,不能享受brew upgrade的统一管理。
我在新 Mac 上执行brew update之后,再用brew install --cask brewui就装上了。整个过程大约两分钟。老 Mac 上因为系统版本偏旧,安装后打开就闪退,排查了很久,最终发现是缺少某个系统库。这提醒我,如果你用的系统版本比较旧,优先考虑方法二,下载兼容的历史版本,不要一味追求最新版。
2.3 首次启动的界面布局
BrewUI 装好后,首次打开会自动扫描系统里已有的 Homebrew 环境。这个扫描过程视软件包数量而定,我第一台机器大概装了 300 多个包,扫描了大概十几秒。界面上会显示一个进度条,如果卡住不动,大概率是网络问题,因为它在尝试连接远程仓库刷新索引。
扫描完成后,主界面分成几个区域。左侧是导航栏,按类型划分:已安装、公式、图形应用、服务、依赖树等。中间是软件包列表区,每一行会显示包名、当前版本、最新版本、安装状态。右侧是详情面板,选中某个包后,这里会显示它的描述、所属分类、依赖项、反向依赖、安装日志等详细信息。
顶部是搜索框和操作按钮。搜索框支持实时搜索,输入关键字后,列表会自动过滤。操作按钮会根据当前选中的软件包动态变化,比如选中一个已安装的包,按钮是卸载和升级;选中一个未安装的包,按钮则是安装。
这个布局对于用过任何软件管理工具的人来说都很容易上手。唯一需要注意的是,界面上的“更新”按钮和“升级”按钮是有区别的:更新是刷新 Homebrew 的本地索引,升级才是真正把软件包更新到新版本。这个逻辑和命令行里brew update与brew upgrade的区别是完全一致的,但新手很容易混淆。
3. 核心功能实操与细节拆解
3.1 软件包搜索与浏览:从命令到可视化的转变
命令行里搜索软件包,用的是brew search命令,输出纯文本列表。BrewUI 的搜索框则更直观,输入关键字,列表实时过滤,而且会同时显示 formulae 和 casks 两类结果。图表里每个包旁边都有小图标标识:终端图标代表命令行工具,图形界面图标代表桌面应用。类别不同,安装路径和管理方式也不一样。
举个例子,我在搜索框里输入 “git”,界面会返回几条结果。其中 git 是命令行工具,git-lfs 是大文件存储扩展,gitkraken 是图形化 Git 客户端。每条结果都带描述,一眼就能看出区别。这个体验比命令行友好太多,因为brew list | grep git只能显示你已安装的包,brew search虽然能搜全部,但输出格式比较原始,小包名多了以后,眼睛容易看花。
BrewUI 还提供了按类别、状态、仓库来源的筛选器。比如你可以只看已过时的包,只看官方仓库的包,或者只看自己手动安装的包。这种多维度筛选在命令行里其实也能实现,但要组合brew list、brew outdated、brew info几个命令,再手动对比,远不如界面里点几下筛选器来得方便。
3.2 安装、卸载与升级:图形界面下的实际操作
安装软件包在 BrewUI 里特别简单。搜索到目标包后,点右侧的“安装”按钮,界面下方会弹出一个日志窗口,实时显示安装过程。这和终端里跑brew install的效果类似,但有个很实用的差别:日志窗口会按步骤分段显示,每一步的耗时和结果都有标注。
我实际测试了一个场景:安装 nodejs。在命令行里,这个操作会让人等得有点焦虑,因为输出内容多且滚动快,你不知道它在下载还是卡住了。记账界面里,你能看到它当前在下载哪个包、是下载还是编译、还有多久完成,进度条一目了然。安装完成后,按钮状态会从“安装中”变为灰色“已安装”,详情面板里也会显示版本号、安装路径、依赖了哪些包。
卸载同样直观。选中已安装的包,点“卸载”,它不仅会删掉包本身,还会提示有哪些其他包依赖它。如果你强行走命令行brew uninstall,有时候会顺带删掉一些被依赖的包,后续其他软件可能就报错。在 BrewUI 里,这个依赖提醒是加粗显示的,虽然它不能强制阻止你,但至少给了你一个确认的机会。
批量升级是我觉得最省心的功能。命令行一键brew upgrade虽然省事,但风险在于你不知道它会升级哪些包,也不知道哪些包可能因为升级而出现不兼容。记账界面的“更新”面板里,它会先列出所有有新版本的包,你可以在列表里勾选,只升级选中的包。这个流程和brew outdated加brew upgrade组合起来的效果一样,但界面操作更灵活。
3.3 依赖关系与反向依赖:整理软件包之间的牵连
依赖管理是 Homebrew 里比较难懂的一块,也是 BrewUI 让我觉得最值回票价的部分。
先说依赖树。在命令行里,brew deps --tree node会打印出一棵用 ASCII 字符组成的树,层次多了以后,横向层级多到换行,读起来很难受。在 BrewUI 里,依赖树是真正的树形控件,可以展开合拢,每个节点都有图标和版本号。点击某个依赖节点,会跳到那个包的信息页,再看它的依赖。这种交互方式在排查“为什么这个包被装上了”的时候特别有用。
反向依赖也很有价值。你选中一个包,详情面板会列出“哪些包依赖了它”。我在清理系统时遇到过这种情况:想卸载某个 Python 版本,但不确定有哪些项目或者工具在用。直接brew uninstall有风险,因为可能有包在运行时依赖它,卸掉后会引发连锁问题。BrewUI 会把反向依赖列表拉出来,你一看:哦,原来有两个包依赖它,那我不急着卸,或者我先升级那些依赖它的包,再考虑卸载。拥有了这些信息,做决定就靠谱多了。
需要说明的一点是,BrewUI 展示的依赖关系不是自己解析的,而是读取了 Homebrew 的索引数据和安装记录。所以它反映的信息和brew info看到的是同一套,只是呈现方式更友好。
3.4 服务管理:后台服务一键启动
Homebrew 安装的后台服务,比如 mysql、redis、nginx、postgresql,日常管理基本都要在命令行里敲brew services。以前用命令行,每天好几个服务切换启动、停止、重启,偶尔还要设置开机自启,一条条敲命令虽然不复杂,但次数多了总容易烦。
BrewUI 的服务管理面板把这些操作做成了开关按钮。界面上会列出所有在服务列表里的软件,每个服务旁边有当前状态,比如“已停止”“已运行”,还有对应的端口号。启动、停止、重启、设置开机自启,点一下就行。开机自启用的是开关形式,开启后对应的是命令行里的brew services start,关闭则是brew services stop。
有一点要特别注意:BrewUI 开关服务时,日志信息和命令行在斜杠下运行brew services start是一样的,意味着服务的启动方式、配置文件路径、日志文件位置都保持一致。如果你以前在命令行里习惯了看/usr/local/var/log下的日志,这个习惯在图形界面里也完全适用。
我自己在管理多项目本地环境时,用 BrewUI 切换 mysql 和 redis 的频率非常高,再也不用开一个终端窗口专门敲服务命令了。但是,如果你是那种喜欢自定义启动参数、要手动修改 plist 文件的高阶用户,图形界面的灵活性就不够,还是建议回到命令行去操作。
4. 典型使用场景与操作流程
4.1 新环境初始化:从零搭建开发机
刚拿到一台新 Mac,或者重装系统后,环境初始化是最繁琐的步骤之一。以前我的做法是翻出整理的脚本,批量执行 brew 命令。现在我会先安装 BrewUI,然后在界面上完成大部分工作。
第一步是确认 Homebrew 已安装并更新索引。用 BrewUI 的“更新”按钮刷新一次,确保索引是最新的。第二步是在搜索框里逐个搜索需要的软件包,比如搜 python、node、git、docker,然后按类别区分 formula 和 cask 分别安装。第三步是装完基本工具后,用服务管理面板把 mysql、redis 等后台服务启动起来并设置开机自启。
这个流程虽然花费的时间和命令行差不多,但好处是整个过程都是可视化确认的。误差率大大降低。比如你想装 node 却误装了 nodeenv,界面上的状态栏和描述文字会帮你提前拦截。还会有个隐藏好处:BrewUI 会展示每个包的大致体积和维护者信息,装之前你就知道这个包大概占多少空间,这在磁盘空间紧张的时候很有用。
4.2 批量升级与日常维护
日常使用中,软件升级的频率其实很高,因为 Homebrew 的包更新很频繁。以前我用命令行升级,步骤如下:先brew update,再brew outdated看哪些包有新版本,再手动筛选重要的包brew upgrade。现在用 BrewUI,步骤变成了:打开界面,点“更新”刷新索引,切到“可升级”筛选,勾选要升级的包,点“升级”。
两者的结果是一样的,但体验差异明显。命令行里的brew upgrade是整包输出,一旦升级失败,你只能看到报错信息滚过屏幕,很难定位它的上下文。BrewUI 会针对每个包单独记录升级日志,失败了会以红色高亮,查看失败的详细信息也方便,不打断其他包的升级流程。
日常维护还要注意清理。Homebrew 装过多个版本后,旧版本不会自动删除,时间久了会占用不少磁盘空间。命令行brew cleanup能解决这个问题,BrewUI 的“清理”按钮执行的是同样的操作,但会先列出即将删除的文件和预计释放的空间。我建议养成按月清理的习惯,这对保持开发机磁盘干净很有帮助。
4.3 快速诊断与问题定位
软件包装多了,环境问题会逐渐积累。最常见的是:某个命令command not found,某个 Python 库导入失败,某个服务启动报错。排查这些问题的第一站,往往是brew doctor。
BrewUI 把诊断入口整合得很自然。在“诊断”面板里,点“运行检查”,它会执行类似brew doctor的检查项,结果以列表展示。每条问题都有严重级别标记:红色是错误需要处理,黄色是警告建议处理,绿色是正常。点击具体问题,会展示详情和解决方案建议。
举个例子,有次我遇到 pip 安装的包在执行时找不到某个动态链接库,排查很久都没头绪。打开 BrewUI 的诊断面板,发现它提示我某个 formula 的版本和系统架构不匹配,建议重新安装。照着建议操作后,问题果然解决了。这种诊断方式省去了手动敲brew doctor再逐条搜索错误信息的步骤,对快速定位环境问题帮助很大。
5. 常见问题与排查技巧实录
5.1 权限问题汇总
在使用 BrewUI 的过程中,权限相关的报错比较常见。特别是安装 cask 应用时,有时会提示没有权限写入 Applications 目录。这是因为 macOS 的系统完整性保护机制对某些目录有严格的权限要求,尤其是新版本系统对用户授权限制更严格。
解决方法有几个层面。首先,确认你当前登录的用户是否是管理员权限。如果不是,在系统设置里把自己加入管理员组,或者在安装过程中右键“以管理员身份运行”是不存在的,macOS 没有这个选项,所以正确做法是使用管理员账号登录后重新操作。其次,如果对某个目录没有写权限,可以手动在终端里修改目录权限,但需要注意不要过度修改系统目录的权限,否则会引发安全问题。最后,检查 BrewUI 本身是否有访问磁盘的权限,这在“系统设置-隐私与安全性-完全磁盘访问权限”里可以设置。
5.2 网络与下载源问题
国内用户使用 Homebrew 时,网络问题一直是最常见的痛点。BrewUI 本身不会改变 Homebrew 的下载通道,它依旧会从 GitHub 下载软件包,所以如果你在终端里用 Homebrew 下载很慢或者经常失败,用 BrewUI 也一样会慢或者失败。
这种情况下,常规做法是配置国内镜像源。因为涉及具体网络环境差异,我一般不推荐固定某一家镜像源,核心原则是:选择信誉好、更新及时、在你网络环境下速度快的镜像;配置方式是设置环境变量,比如HOMEBREW_API_DOMAIN、HOMEBREW_BOTTLE_DOMAIN等;配置后需要重启 BrewUI 才能生效。
我自己使用中遇到的问题是,安装包时偶尔会卡住,进度条一直不动。排查思路是先确认是整体网络问题还是单个包源问题,可以在终端里直接访问一下下载地址测试连通性;然后在 BrewUI 里重新触发下载;如果还是卡住,有可能是本地 DNS 解析问题,可以切换 DNS 再试。总之,网络类问题的排查思路和命令行场景下是完全一致的。
5.3 界面卡顿与扫描速度慢
BrewUI 卡顿,一般有三个可能原因。一是软件包数量太多,首次扫描或刷新索引时负载较高,特别是机器刚好还在执行其他编译任务时。二是 Homebrew 索引文件过大,或者本地缓存文件损坏,这会导致读取和解析变慢。三是 BrewUI 本身在某个版本存在内存泄漏问题,长时间运行后越来越卡顿。
遇到卡顿,我一般的处理流程是:先观察是否只有刷新索引时卡,还是日常操作也卡。日常操作卡,优先重启 BrewUI;界面打不开或者打开后白屏,尝试删除它的缓存目录后重启;如果扫描完一直转圈,检查终端里单独敲brew list是否正常,如果终端正常,问题出在 BrewUI 的索引解析上,清理它的缓存目录往往能解决。
5.4 常见问题速查表
为了方便参考,我把平时遇到比较多的问题整理成一个表格,供大家对照排查。
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
| 启动后白屏或无响应 | 系统版本过旧、BrewUI 缺少系统库 | 下载历史兼容版本;检查系统更新 |
| 安装包一直卡在下载阶段 | 网络原因、下载源不稳定 | 检查网络;配置国内镜像源 |
| 卸载包后关联软件异常 | 反向依赖被破坏 | 在 BrewUI 反向依赖列表里核对后再卸载,必要时重装依赖 |
| 服务管理面板状态不准确 | 服务由非 Homebrew 方式安装 | 手动用终端确认服务真实状态,避免误判 |
brew update一直失败 | DNS 问题、GitHub 访问异常 | 检查 DNS;更换镜像源 |
| 清理空间后并集缓慢 | 本地缓存多、索引大 | 定期手动运行清理;使用 BrewUI 的清理功能 |
| 界面显示包版本和终端不一致 | 索引未及时更新 | 点“更新”按钮刷新索引 |
这张表基本覆盖了我用 BrewUI 两个多月以来的多数问题。如果遇到不在表里的情况,我的建议是先跑一遍终端brew doctor,大多数环境问题都能在里面找到线索,然后带着线索去项目仓库的 Issues 页面搜索,比自己瞎猜效率高得多。
6. 进阶技巧与效率提升
6.1 用 BrewUI 管理开发环境的一致性
对经常在多个项目间切换的开发者来说,保持各项目依赖的版本一致性很重要。Homebrew 本身有brew bundle机制,可以把当前机器上的软件清单导出成一个 Brewfile,然后在另一台机器上导入。但命令行操作导出导入,中间有不少手动环节,比如导出后要自己编辑文件、导入前要让本地索引最新。
BrewUI 把 Brewfile 的导出和导入做成了比较顺畅的流程。你可以随时把当前机器的软件包清单导出一份本地文件,也可以从文件导入并批量安装。这个功能非常适合维护多台开发机的人,比如我出差带上笔记本,到公司后可以用同样的 Brewfile 把常用的开发工具补齐,省去了一台台搜索安装的麻烦。
另外,BrewUI 的导出功能可以按类别过滤,比如只导出命令行工具,或者只导出桌面应用。虽然这些功能用命令行也能实现,但可视化界面让整个过程更直观,不容易漏选。
6.2 结合命令行使用:GUI 和 CLI 互补
这里想聊聊我自己的使用习惯。用了 BrewUI 一段时间后,我没有完全抛弃命令行,反而是两种方式互为补充。日常浏览、搜索、批量升级用 BrewUI,涉及复杂的自定义安装、修改启动参数、调试故障时,还是会回到终端操作。
什么场景下我会继续用命令行?第一是安装一些特殊版本的包,比如指定brew install python@3.9,BrewUI 的界面虽然能选版本,但灵活性不如命令行。第二是调试 Homebrew 本身的问题,比如brew doctor --verbose、brew config这些命令,BrewUI 没有完全覆盖。第三是编写自动化脚本的时候,命令行天然适合批量操作,BrewUI 就是个辅助工具。
所以我的建议是,不要神化 BrewUI,也不要轻视它。它不会取代命令行,但能让你的日常包管理体验上一个台阶。特别是当你机器上的软件包数量超过一百个以后,图形界面的优势会越来越明显。
6.3 我对 BrewUI 的整体体验与建议
最后聊聊整体体验。BrewUI 目前最打动我的点,是它把 Homebrew 的复杂度封装成了一个稳定、可控的图形界面。依赖关系可视化、反向依赖提醒、批量升级勾选、服务管理面板这些功能,可以说直击了包管理的核心痛点。对于新老用户都提供了价值:新手降低了门槛,老手提升了效率。
如果说有遗憾,那可能是 BrewUI 对 Homebrew 全部功能的覆盖还差那么一点。一些冷门的高级参数,还是得回命令行。此外,部分版本在界面流畅性上有优化空间,特别是包数量多的时候,滚动和搜索会略有迟滞。但我个人觉得这些都不影响它成为一个值得尝试的工具。
实际使用下来,我最喜欢的一个小功能是:每次打开 BrewUI,它都会先自动刷新一次索引,把当前机器上所有软件的变化情况用列表展示出来。这个小设计让我每次都能快速知道,哪些包被新装了,哪些包有更新,哪些包很久没用了。对于一个经常在不同项目间切换的开发者来说,这种全局视角真的能避免很多环境问题。如果你也装了 Homebrew 并且厌倦了命令行里的一堆文本输出,不妨试试在界面上管理你的软件包,说不定能找到不一样的体验。