news 2026/9/20 6:24:17

BrewUI教程:可视化管理Homebrew,解决Intel Mac安装与卸载残留问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
BrewUI教程:可视化管理Homebrew,解决Intel Mac安装与卸载残留问题

前阵子帮朋友处理一台老 Intel Mac,Homebrew 装了半天各种报错,装完顺手给他配了 BrewUI,他看完屏幕愣了一下:“这比黑窗口友好太多了?”——是的,虽然用命令行管理 Homebrew 是默认玩法,但 BrewUI 把包管理器变成可视化界面这件事,确实解决了很多人的真实痛点。这篇文章就从 BrewUI 讲起,聊聊它到底能做什么、怎么装、怎么用,顺便把 Intel Mac 装不了 Homebrew、安装报错、卸载残留这些高频问题一起梳理清楚。不管是刚接触 Homebrew 的新手,还是已经折腾了几年命令行的人,这里都有可以直接参考的内容。

1. 折腾 Homebrew 这么久,为什么还需要一个图形界面

1.1 命令行真的不够用吗

Homebrew 是 macOS 上绝大多数开发者绕不开的包管理器,装编译工具、服务、桌面软件基本都靠它。但“好用的包管理器”和“好用的人类管理器”是两回事。日常用命令行敲brew install确实爽,可真到了排查问题的时候,痛点就全出来了。

我见过不少人的电脑上brew列表越滚越长,装过的包自己都忘了是干嘛用的。想知道某个包是谁依赖了它,得敲brew deps --tree,出来的树形结构在终端里占满整个窗口;想停掉一个后台服务,得先查brew services list,再对着进程名手动操作;卸载软件更是重灾区,brew uninstall只卸载了那个包本身,不用的依赖、残留的缓存、残留的启动项全都散落在系统里。

BrewUI 的核心价值不是帮你把所有命令可视化,而是把高频操作做了合理的封装。包搜索、安装、卸载、更新、服务启停、缓存清理、依赖查看,这些动作在图形界面里基本都是点一下的事,而且每一步操作对应什么命令、会改动哪些目录,界面上都交代得比较清楚。对于不想背命令、或者偶尔用一次 Homebrew 的人,这套交互是真的能省下不少试错成本。

1.2 适合什么人用

先说结论:BrewUI 不是一个“替代命令行”的工具,而是一个“降低使用门槛”的辅助界面。就算装了 BrewUI,熟悉brew命令依然有价值,因为排查网络问题、写自动化脚本、处理系统级配置时,终端里那一套逻辑绕不开。

但如果你是下面几类人,BrewUI 的体验会比纯命令行好很多:

  • 刚接触 macOS 开发环境的新手:对终端本身不熟,每次看到绿字黑底就心慌,图形界面能先帮你把“装软件”这件事跑通,再慢慢理解底层命令。
  • 日常只是偶尔装一两个工具的人:没必要为了一个文件转换工具去背一遍brew install的参数规范,打开 BrewUI 搜索一下点安装,完事。
  • 在一台机器上管理多个服务的人:BrewUI 里可以直观看到 redis、nginx、postgres 这类后台服务当前是 running 还是 stopped,点一下就能切换,比对着终端进程列表找舒服得多。
  • 需要给别人维护电脑的人:给同事或朋友装环境的时候,直接给他留一个图形工具,后续他自己装软件也能自己搞定,不用长期当人工客服。

2. 环境准备:先搞定 Homebrew 本身

2.1 检查是否已安装

安装 BrewUI 之前,得先确保 Homebrew 本身是可用状态。别笑,我遇到过不少下完 BrewUI 打不开、或者打开后显示找不到 brew 的情况,最后排查了一圈才发现 Homebrew 压根没装上,白折腾半小时。

检查是否已经安装 Homebrew,可以在终端里执行:

brew --version

如果输出了类似Homebrew 4.x.x的版本号,说明已经装好了。如果提示command not found: brew,那就需要先安装 Hombrew。

另外还有两种验证方式。一是用which brew看 brew 的可执行文件位置,Apple Silicon 芯片通常在/opt/homebrew/bin/brew,Intel 芯片通常在/usr/local/bin/brew。二是用type brew看 shell 是否能正确解析这个命令。定位到 brew 的实际路径在后续排查 BrewUI “找不到 brew”的问题时非常管用。

如果 Homebrew 还没装,第一步要确认 Xcode Command Line Tools 是否就绪:

xcode-select --install

系统会弹窗询问是否安装命令行工具,点安装等它跑完即可。这一步很多人会漏掉,导致后面装什么都是xcrun: error: invalid active developer path或者编译相关工具链缺失的报错。

2.2 Intel Mac 安装 Homebrew 的坑

关于“Intel Mac 安装不了 Homebrew”的情况,最近确实变多了,但这个事得分清楚是“装不上”还是“装完后用不了”。

最常见的一种情况是系统版本太旧。Homebrew 对 macOS 的最低版本要求一直在往上提,尤其是 4.x 之后的版本,如果系统停留在 macOS 12.x 以下,安装脚本会在中途直接报系统版本过旧而退出。处理方法很简单:先升级系统到受支持的版本再装。某些太老的 Intel 机器升不到较新系统,那就只能考虑使用旧版本 Homebrew,或者换用 MacPorts 这类老牌包管理器顶上。

第二种情况是安装过程中网络请求失败。Homebrew 官方安装脚本要访问 GitHub 仓库和生成了许多远程文件,国内网络环境不稳定时就容易出现curl: (7) Failed to connectFailed to connect to raw.githubusercontent.com port 443。解决方案也很成熟:安装时给 Homebrew 指定国内镜像源环境变量,比如清华大学开源软件镜像站提供的 TUNA 源,或者中科大 USTC 源。

在终端执行安装前先写入镜像配置:

export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git" export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git" export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles"

然后再执行安装脚本。如果安装过程中因为网络中断而报错,把上面这几个环境变量保存到~/.zshrc~/.bash_profile里,再重新执行安装脚本即可。这里建议先确认好自己 shell 用的是 zsh 还是 bash,现在 macOS 默认基本都是 zsh,配置写入~/.zshrc通常没问题。

第三种情况是目录权限问题。Intel Mac 上 Homebrew 默认安装到/usr/local,这个目录默认是/usr/local归管理员所有,普通用户没有写入权限。部分老系统里,如果/usr/local本身不存在或者所有者和当前用户不一致,安装过程就会在创建目录时报错。解决办法是提前手动创建并修改归属:

sudo mkdir -p /usr/local/Homebrew sudo chown -R "$USER":admin /usr/local/Homebrew

2.3 安装失败的通用排查

即使预判了系统版本、网络、权限这几个大坑,Homebrew 安装过程中还是可能遇到各种玄学报错。我把实操中遇到最多的场景整理了一张表,方便按图索骥:

报错信息核心原因建议处理
curl: (7) Failed to connect to raw.githubusercontent.com安装脚本关联的远程资源无法访问配置国内镜像源后重新执行安装脚本
curl: (35) LibreSSL SSL_connect下载过程中 TLS 握手异常检查系统时间是否准确,更换网络环境后重试
fatal: early EOF/index-pack failedgit 拉取仓库过程中中断关闭自动更新:export HOMEBREW_NO_AUTO_UPDATE=1,再重新安装
Error: /opt/homebrew/bin is not in your PATH安装完成后 shell 未找到 brew手动添加 PATH:echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zshrc
Cannot install under Rosetta 2Intel 芯片环境下运行了 ARM 版安装逻辑确认安装脚本在对应架构下执行,或重置 Terminal 架构
Error: Permission denied @ dir_s_mkdir目录写入权限不足修正/usr/local/opt/homebrew的目录权限

这里有一个经常被忽略的动作:重试安装前建议先把可能残留的克隆目录清理掉,否则还会报fatal: destination path ... already exists。干净的重试方式是:

rm -rf /usr/local/Homebrew # Intel 机器 rm -rf /opt/homebrew # Apple Silicon 机器

当然,删之前确认下这台机器没有依赖 Homebrew 跑关键任务,不然删完又是一晚上活。

3. BrewUI 安装与界面走读

3.1 两种安装方式

Homebrew 状态正常后,安装 BrewUI 可以考虑两条路。

第一种是从 Homebrew 直接安装。BrewUI 如果已经在 homebrew-core 或 cask 仓库里,一条命令就能搞定:

brew install --cask brewui

安装完成后在“启动台”里搜 BrewUI 就能看到图标。这种方式的好处是以后brew upgrade或者brew update时会同步检查到 BrewUI 的版本更新,不用专门记它有没有新版本。

第二种是从 GitHub Releases 页面下载 dmg 安装包,手动把 BrewUI.app 拖进 Applications 目录。这种方式适合不想让 Homebrew 多管理一个图形应用的场景,也适合 BrewUI 尚未进入仓库时的人工安装。下载安装包后如果 macOS 提示“无法打开,因为无法验证开发者”,可以右键点击应用图标选择“打开”,系统会弹出确认对话框,点确认即可。也可以用命令去除 quarantine 标记:

xattr -dr com.apple.quarantine /Applications/BrewUI.app

顺便说明一下,BrewUI 这类图形管理工具的定位是一个“壳”,它通过调用本地安装的brew命令来获取数据、执行操作。所以它本身不包含 Homebrew 的实现,也不会绕过brew去直接改包目录。理解这一点之后,遇到 BrewUI 展示的数据和终端输出对不上时,你就知道优先应该去检查 Homebrew 本身的状态。

3.2 首次启动与界面布局

BrewUI 第一次启动时,如果提示找不到 brew,多半是因为它的进程没有读取到 shell 里的 PATH 配置。解决办法有两个:一个是在 BrewUI 的偏好设置里手动指定 brew 可执行文件的完整路径,比如/opt/homebrew/bin/brew;另一个是在启动前从终端运行open /Applications/BrewUI.app,让它继承终端的 PATH 环境变量。

界面整体结构一般分四个区域。首选是仪表盘,展示当前已安装的 formula(命令行工具)和 cask(图形应用)数量、Homebrew 版本号、可更新包数量、缓存占用大小。一屏就能扫完 Homebrew 的整体状态,比挨个跑命令快。

包列表区域占主界面大部分空间,支持搜索框直接过滤包名,同时显示每个包的状态:已安装、未安装、可更新、有问题。点进包详情后能看到它的版本、依赖数量、依赖树、安装路径和安装时间,这些信息在排障时非常有用。

服务管理视图列出当前已注册的brew services服务,标注运行状态、当前端口和自启状态。这里可以直接点开关对服务做启动、停止、重启,对应的命令会在下方或日志区显示出来,方便你同步学习对应的命令行操作。

日志区在操作时会动态显示 brew 命令的实际输出。我每次用图形界面操作完都会顺便扫一眼日志,这一个习惯帮我养成了对 Homebrew 底层行为的基本判断力,也方便出问题时把日志直接粘去搜。

4. 核心功能实操:从装包到清理一次搞定

4.1 搜索与安装

用 BrewUI 安装软件的正确打开方式是:先搜索,再判断类型,最后确认安装。

在搜索框输入关键词后,界面上会一次性列出匹配的 formula 和 cask。比如搜python,能看到python@3.11python@3.12这些命令行版本,也可能看到python相关的桌面应用。两者区别很直观:formula 是给终端用的工具,安装后主要在命令行里调用;cask 是图形应用,相当于帮你完成“下载 dmg 并拖入 Applications”这一步。

选好目标点安装后,BrewUI 会显示即将执行的命令预览、包依赖数量、预估体积。这时候先别急着确认,看一眼依赖是不是都已经在系统里。如果一个包要拉几十个依赖,说明这个软件比较庞大,安装时间可能较长,心里先有数。

安装过程中的日志会实时滚动显示。第一次运行某个大包时,如果系统没有缓存过对应版本,源码编译或下载阶段会非常耗时。比如安装 PHP、Node 的某些扩展,经常要等待好几分钟。这时候界面上的日志比终端友好的一点是:它把正在执行的操作步骤用更容易看懂的方式排列,你能清楚看到卡在哪一步。

4.2 更新与升级

Homebrew 日常维护里最容易被忽略的就是“该更新了”。长期不执行brew update,包列表可能停留在几周甚至几个月前,安装新软件时会拉到过期的依赖索引。

BrewUI 的检查更新功能等价于brew update,它会从远端拉取最新的 formula 列表和 cask 列表,耗时取决于网络状态和仓库体积。更新索引完成后,界面上会区分出“有新版”的包,并显示当前版本和目标版本号。

单独升级某个包的逻辑和brew upgrade <包名>一致,只针对选中项执行。全部升级则等同于brew upgrade,会一次性升级所有可更新包。我的建议是:别急着全部升级,尤其是安装了多个版本共存的场景,比如python@3.10python@3.12,全部升级可能把默认的版本链接切换到新版本,某些项目脚本就挂了。

升级前还应该做一件事:顺带看一眼哪些包已经不再被任何其他包依赖,这类包属于“孤儿依赖”,可以执行brew autoremove清理掉。BrewUI 如果提供了对应的“清理未使用依赖”按钮,可以直接用;如果没有,去终端执行一下也行。减少盲目更新范围,更新速度会快很多,出错概率也小很多。

4.3 服务管理(Services)

Homebrew 里的服务管理,指的是brew services命令管理的后台任务。这类服务包括 redis、nginx、postgresql、mysql、mongodb 等,它们可以前台启动,也可以注册为后台服务随登录自启动。

brew services的命令行版本是:brew services list查看服务列表,brew services start <服务名>启动,brew services stop <服务名>停止,brew services restart <服务名>重启。看起来不算复杂,但每次都要敲一遍完整命令还是有点烦,尤其是同时管理五六个服务时,经常忘了哪个是 started、哪个是 stopped。

BrewUI 的服务管理视图把这一切变成开关和按钮。列表里能直观看清每个服务当前的状态、有没有设置开机自启、端口占用情况。点击启动时,BrewUI 会调用对应的 brew services 命令,并在日志区给出实际执行的命令上下文,方便你反向学习。

有一点需要特别留意:brew services start注册的服务,和手写 LaunchDaemon/LaunchAgent plist 文件的效果类似,但它生成的配置文件是 Homebrew 统一管理的。如果你之前专门手写过某个服务的自定义 plist 配置,又在 BrewUI 里点了一次启动,两者可能会产生配置冲突,界面上的状态可能和实际进程不一致。遇到这种玄学情况,优先检查/Library/LaunchDaemons~/Library/LaunchAgents下有没有同名配置。

4.4 缓存清理与卸载

brew在下载软件包时,会把安装源文件缓存到本地目录:/Library/Caches/Homebrew(系统级)和~/Library/Caches/Homebrew(用户级)。日积月累,这个缓存目录会占掉好几个 GB。我见过一台机器缓存膨胀到 10GB 以上,磁盘告急才跑brew cleanup

BrewUI 的清理功能对应的是brew cleanupbrew autoremove的组合。图形界面上一般会有两个明确的按钮:

  • 清理缓存:删除下载过的旧版本软件包缓存。
  • 清理未使用依赖:将不再被任何包引用的孤儿依赖卸载掉。

用的时候别一次性全开。第一次清理时我先跑“清理未使用依赖”,因为项目里可能还有老脚本在偷偷依赖某个包,全删了容易出现运行时“找不着某某库”的报错。第一次用保守一点,清完跑一段时间观察一下,再决定要不要全量清理。

卸载单个包在 BrewUI 里也很简单,进入包详情点卸载即可。但要理解它背后的逻辑:brew uninstall <包名>默认只是卸载目标包,但可以用--rmdependencies参数顺带移除不再被依赖的关联包,界面有时候会保留这一步的选项。如果卸载完发现残留了配置文件、日志文件,还需要去对应的用户目录和配置目录里手动清理。

5. 常见问题与排查实录

5.1 BrewUI 本身的问题

BrewUI 打不开的典型场景,大多集中在系统权限、路径和版本不兼容三个方面。

  • 首次启动提示“已损坏,无法打开”:通常是 macOS Gatekeeper 对未签名应用的拦截,终端执行xattr -dr com.apple.quarantine /Applications/BrewUI.app,或者右键应用图标选“打开”并确认即可。
  • 打开后白屏或一直转圈:优先怀疑 Homebrew 本身有异常。先回终端敲brew update看是否报错,如果 Homebrew 正常,再检查 BrewUI 是否是最新版本,旧版本可能和最新 Homebrew 的数据格式不同,出现解析失败。
  • 提示“brew executable not found”:BrewUI 没有继承 shell 的 PATH。按上文说明,在设置中手动指定 brew 路径,或从终端启动应用。
  • 操作包时卡住:BrewUI 执行 brew 命令时本质上是在等终端的输出。如果网络不好导致brew update长时间无响应,界面就会一直停在执行中。处理办法是调大日志界面的刷新频率,或者干脆用终端临时执行命令看卡在哪一步。

还有一个容易被忽略的细节:BrewUI 在运行时如果有多个窗口同时操作同一个包,可能在 brew 的锁文件上产生竞争。一个操作没结束,另一个操作会等锁或直接报错。最简单的办法是同一时间只在一个实例里执行包管理操作。

5.2 Homebrew 卸载残留清理

有人装上 BrewUI 后觉得不需要,或者 Homebrew 本身出了问题想整个推倒重来,这时就要面对“卸载残留”这个问题。Homebrew 的官方卸载脚本是最稳妥的起点:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"

脚本会尽量还原安装前的状态,但残留不一定清得干净,尤其是旧版本、手动编译安装、Cask 安装的图形应用。清理残留时主要盯这几个路径:

路径说明
/opt/homebrewApple Silicon 芯片的主安装目录
/usr/local/HomebrewIntel 芯片的主安装目录
/usr/local/Cellarformula 包的安装目录
/usr/local/Caskroomcask 图形应用的安装目录
/Library/Caches/Homebrew系统级下载缓存
~/Library/Caches/Homebrew用户级下载缓存
/Library/LaunchDaemons服务自启配置(可能残留)
~/Library/LaunchAgents用户级服务自启配置(可能残留)

手动清理时先删主目录,再删缓存,然后检查 shell 配置文件里有没有残留的 Homebrew 相关环境变量。grep -i homebrew ~/.zshrc ~/.bash_profile可以快速定位。

另外提醒一句:如果这台机器上还有其他依赖/usr/local/bin/brew的脚本,卸载 Homebrew 时最好事先排查一下。很多第三方工具的安装脚本都会默认去调用 brew,Homebrew 不在了,这些工具的下一次更新就会报一堆“command not found”。

5.3 常见 Homebrew 报错速查

把日常运维中最常被问到的 Homebrew 报错汇总一下,也算给命令行阶段留个速查表。这些报错同样会出现在 BrewUI 的实际执行日志里。

报错信息可能原因处理方式
Not a valid ref: refs/remotes/origin/mastergit 仓库状态异常,分支索引错误删除 Homebrew 对应仓库的 git 数据,重新执行brew update
Remote branch origin/master not foundHomebrew 的远程仓库地址被改错检查git remote -v,恢复为官方地址或镜像地址
Error: Cannot install formula under Rosetta 2Apple Silicon 机器在兼容模式下运行通过原生的 Terminal.app 执行,不要用 Rosetta 模式打开终端
Error: Permission denied @ rb_file_s_symlink安装目录或临时目录权限异常检查并修正/usr/local/opt/homebrew的权限归属
Error: The following formulae cannot be installed依赖冲突或版本冲突查看具体冲突的依赖名称,先卸载对应版本或使用--force提示中的方式
Error: Checksum mismatch下载文件校验失败删掉缓存后重试安装
Error: FormulaUnavailableError包名拼错或库索引过旧brew update再重新搜索包名

遇到报错有一个原则:信息集中在最底部那条。BrewUI 日志区会显示完整输出,很多人一看到满屏红色就往截图里从头截,其实最有价值的往往是最后两三行。对应着最后一行去搜,基本上都是答案的一半了。

5.4 系统版本与架构问题的边界处理

Intel Mac 或旧系统在安装 Homebrew 相关工具时,如果确实无法满足新版 Homebrew 的要求,可选的替代方案并不少。

方案一:升级 macOS。只要能升级,这是最省事的路径。Homebrew 对最新系统的兼容性永远是最好的,很多包依赖新版系统特性,旧系统只能获得旧版本包的支持,时间成本会慢慢体现出来。

方案二:使用旧版本 Homebrew。如果机器因为硬件原因确实无法升级到高版本系统,可以到官方 GitHub 仓库找到匹配旧系统的历史 tag,用对应版本安装。安装成功后要固定版本,关闭自动更新,否则下次brew update又会拉回与系统不兼容的版本。

方案三:更换包管理器。老 Intel Mac 上除了 Homebrew,还有 MacPorts 这种老牌方案,它自带独立的目录结构,不依赖/usr/local/opt/homebrew的固定布局,对旧系统支持一直做得比较稳。如果你只是为了装少量命令行工具,MacPorts 完全够用;如果你依赖大量 Homebrew 生态的 formula,那还是想办法解决 Homebrew 本身的问题更实际。

6. 一点个人体会

用了 BrewUI 之后,我最直观的感受是:它在“命令行”和“图形界面”之间找到了一个舒服的平衡。它不会替我做所有决定,但能让我不用背那么多参数也能把包管理这件事理顺,尤其是给不太熟悉终端的人远程指导时,直接让对面打开 BrewUI 点几下,比远程拍瞎猜命令省心太多。

我个人最常用的功能其实是服务管理视图,以前每周至少有一两次要敲brew services restart,现在打开界面点一下就行。另一个让我推荐它的理由是日志区,别嫌麻烦,每次操作后多看几眼真正的命令行输出,长期下来你对 Homebrew 运作方式的理解会明显超过身边大多数人。

当然,如果你本身是命令行重度玩家,完全可以把 BrewUI 当做一个辅助参考工具,排查依赖关系、查看缓存占用时打开看一眼,日常操作继续留在终端里,两条腿走路互不冲突。最后再分享一个小技巧:装完 BrewUI 后,去设置里把“确认操作”选项打开,这样所有安装、升级、清理操作都会先弹出确认框,能防止鼠标误点导致的大规模升级,尤其是演示屏幕给别人看的时候,这点至关重要。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/20 6:23:52

npx add-skill 实战:Agent Skill 安装与工程化指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 6:19:01

本地AI工作台实战:用WorkBuddy自定义指令与Skill搭建述职报告生成器

上季度述职那天&#xff0c;我走进会议室只带了一台笔记本。汇报到一半的时候&#xff0c;老板突然打断了我的节奏&#xff0c;把 PPT 往前翻了两页&#xff0c;说&#xff1a;“这份总结有感觉&#xff0c;谁帮你写的&#xff1f;”我指了指屏幕上正在后台跑任务的终端——一个…

作者头像 李华
网站建设 2026/9/20 6:18:20

Cursor 跑 Android app 生成:Key 用 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 6:14:58

TensorRT部署实战:YOLO转ONNX到推理加速的五大避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华