如何优雅地更新 MACOS 系统上的软件

上一次更新正好是一年前,所以更新一下。
既然是为了更新而更新,就来写写如何更新吧 ;)
TL;DR:直接看「优雅的软件更新: Duo Updater」小节。

关于 macOS 上的软件安装

与 iOS 正常情况下只能通过 App Store 安装 APP 不同,macOS 有类似 Windows 的自由度来安装和使用第三方软件。
在「设置」-「隐私与安全性」-「安全性」-「允许以下来源的应用程序」中开启「App Store 与已知开发者」后,不管是通过 Homebrew 还是软件官网下载,只要第三方软件满足以下两点即可直接使用:

  • 有效代码签名(Developer ID 证书签名)

开发者加入 99 刀/年的 Apple Developer Program 来获取 Developer ID 证书。

  • 苹果公证(Notarization)

开发者把签好名的 App 上传到 Apple Notary Service,苹果自动扫描通过后打上公证凭证。

关于 macOS 上的软件更新

安装后,新版强迫症患者总希望使用最新版本的软件,问题是 macOS 上的更新途径非常分散且不够优雅:

  • Homebrew

Homebrew 可以用终端命令 brew update && brew upgrade 来更新自己和通过 Homebrew 安装的软件,比如 「mas」。
通过 brew 更新的不便在于 brew 实际只检查版本号大小,不在乎软件本身的许可授权,所以会出现某个软件从 1.X 更新到 2.X 跨版本升级后许可失效,要不重新购买,要不就重新安装低版本……

  • App Store

App Store 可以更新通过 App Store 安装的软件,但只能更新已登陆 Apple ID 所在的区上架的软件,比如登陆美区 Apple ID 后已用国区 ID 下载的只在国区上架的软件需要重新登入国区 ID 才能更新。

  • mas

mas 可以用 homebrew 的 brew install mas 来安装,然后用 mas upgrade 来更新通过 App Store 安装的软件,mas 本身的升级非常的…呃…突飞猛进?

  • 软件自带更新

软件自带更新需要软件保持前台打开或者在后台运行,而有些软件我可能很久都不会打开却想在用到时是最新版本。

一些尝试

终端命令一把梭

我尝试过:

brew update && brew upgrade && brew cleanup && mas upgrade

也可以把它写成 alias 别名:

alias upall='brew update && brew upgrade && mas upgrade && brew cleanup'

重载后生效:

source ~/.zshrc

或者用 zsh 函数封装一下加个菜单:

upall() {
  select choice in "全部更新" "仅 Homebrew" "仅 App Store" "退出"; do
    case $choice in
      "全部更新")   brew update && brew upgrade && mas upgrade; break ;;
      "仅 Homebrew") brew update && brew upgrade; break ;;
      "仅 App Store") mas upgrade; break ;;
      "退出")       break ;;
      *) echo "无效选项,请重试" ;;
    esac
  done
}

alias 或 zsh 函数配置好后之后每次更新只要敲 upall 就能一把梭了。

brew bundle 统一管理

Brewfile 是 Homebrew 的一个配置文件,用于记录和恢复软件包列表,可以用 brew bundle 命令来更新或迁移。

brew bundle dump --describe --force --file=Brewfile    # 生成/更新 Brewfile
brew bundle    # 按 Brewfile 安装/升级/管理

brew bundle 可以实现整机环境的可复现管理,安装 mas 后,brew bundle dump 会自动把 App Store 应用以 mas 条目写进 Brewfile。

使用 Topgrade 一键更新

Topgrade 会自动检测 macOS 系统里的所有包管理器和软件更新机制,比如 Homebrew、mas,然后按顺序「一键更新一切」。
安装 Topgrade:

brew install topgrade

然后使用 topgrade 即可一键更新。
Topgrade 的优点是它覆盖全面且支持交互式,问题是它无法实时检测——当然可以用定时任务,但需要添加 --yes 来跳过交互式。

使用 Pearcleaner 来更新

Pearcleaner 是 Alin LupascuAppCleanerSun Knudsen's Privacy Guides 启发开发的,说实话我试过后就卸载了 AppCleaner LOL
Pearcleaner 集成了:

  • 类似 AppCleaner 的「应用程序管理」
  • 通过删除程序二进制文件无用架构来减小体积的「程序瘦身」
  • 针对常见 IDE 的「清理开发环境」
  • 带高级筛选器的「文件搜索」
  • 管理和维护 brew 的「Homebrew 管理器」
  • 侦测已卸载程序残留的「孤立文件清理」
  • 管理 macOS 第三方插件和拓展的「插件管理器」
  • 管理启动项的「启动服务管理器」
  • 支持在同一个界面里升级 App Store、Homebrew、Sparkle 三个更新渠道的「更新应用程序」。

一直以来我都觉得它的「更新应用程序」功能非常好用,当然其它功能也非常好用,甚至比很多专用收费软件更好,所以在很长的一段时间里 Pearcleaner 是我的首选软件管理器,可惜它从 2025 年后已处于「On Hold」状态

As you may have noticed, development on the app has basically stopped since end of 2025…
… issue responses, feature work, PR reviews, and new releases are effectively on hold indefinitely for now.

Hold 后还可以继续用,但目前已经有一些小 Bug 了,比如读取 Sparkle 渠道的更新日志时会假死,还有和 Homebrew 的联动也时不时出错……

使用 Mole For Mac 来更新

在几次使用 Pearcleaner 遇到问题后,我购买了 @Tw93 开发的 Mole For Mac AKA 「鼴」,它的 CLI 版一经发布就好评如潮,目前已经超过 65K Star。
Mole For Mac 和 Pearcleaner 一样是从 macOS 清理软件做起,后加入软件更新功能,它们的逻辑和问题也是一样:“只检查版本号大小,不在乎软件本身的许可授权”。
BTW,推荐一下 Mole 中文博客,写得非常好,比如「如何更新 Mac 上的所有应用」:

mole 会列出应用来源,通过对应渠道检查更新,阅读兼容说明并备份关键状态,再分批安装,每批完成后,用原来的文档和工作流复测,无需一次把所有版本号变成最新,先保住可用环境。
为什么 macOS 没有一个能更新所有应用的按钮?
App Store 依靠 Apple 收据管理软件,Sparkle 使用开发者发布的 appcast,配置正确时会同时校验 EdDSA 签名和 Apple 代码签名,具体机制见 Sparkle 的安全说明,Electron 应用和厂商更新器使用各自的订阅源,Homebrew 则按 formula 与 cask 升级。

优雅的软件更新: Duo Updater

Duo Updater 是 DuoDuo 在 GitHub 上开源的软件更新器,可以先看看开发者自己写的介绍:Duo Updater:按每个 app 自己的方式更新它

MacUpdater 停更之后,我写了个 macOS 菜单栏更新器:不把所有 app 塞进同一条安装管线,而是顺着每个 app 本来的更新方式去装。开源、无遥测。

Duo Updater 目前应该是可以支持通过 App Store 和 Homebrew 安装的软件、同时支持使用 Sparkle 和 Electron 渠道更新,不如 Topgrade 广泛但已足够。
本章标题是「如何优雅地更新 macOS 系统上的软件」,Duo Updater 优雅在:

这就是 Duo Updater,一个 macOS 菜单栏 app:扫描你已经装好的软件,找出有更新的,然后按每个 app 自己期望的方式去装。纯 Swift,没有遥测,没有我这边的服务器,MIT 开源。

这也是 Duo Updater 和 Pearcleaner 不一样的地方,Pearcleaner 会获取通过 Homebrew 安装的软件更新并列出(类似 brew ls ),还会获取通过 Sparkle 发布的更新并列出,而有些软件会同时在这两个渠道存在——导致重复列出。
Duo Updater 的做法是:

顺着来,不硬来
大多数更新器会挑一条机制,把所有 app 都塞进去。这个不。它先看这个 app 本来是怎么更新的——有的自带更新功能,有的从 App Store 装,有的是用 Homebrew 装的——然后就走那条路。app 自己能更新好的,它交出去让人家自己来;有什么事它做不安全,就直说,而不是猜着来。
界面上尽量把话说清楚:每一行写明你要从哪个版本走到哪个版本,按钮上写的就是接下来真正会发生的事。Update 是装,Relaunch 表示新版本其实已经装好了、只是开着的那份还是旧的。绿点表示这个 app 正在运行,你点之前就知道会不会有东西被关掉重开。
安装这块有几条不肯让步的规矩:绝不强行关掉正在运行的 app——该弹的保存提示照弹,你可以取消,取消了它就不动;大版本升级会先提醒一声再问你,而不是一键装完才发现要重新买授权。装之前还会留一份备份,出问题能退回去。

比如,对于 App Store 安装的软件,Duo Updater 可以通过 mas 和特权助手无障碍跨区域更新,且正在运行的软件会暂停并提示打开 App Store 后继续,而不是直接关闭。
此外 Duo Updater 的「更新日志」查看功能和「发布日志」附带的热力图也很赞,但我最喜欢的是它的 AI 感,看看它自己的「更新日志」和 GitHub 页面你会明白我的意思:

Duo Updater 的更新日志
Duo Updater 的更新日志

Duo Updater 项目的 Issues 页面,AI 自己在玩 LOL
Duo Updater 项目的 Issues 页面,AI 自己在玩 LOL

One More Things…

既然提到了「更新日志」,再推荐一个最近发现的好软件:Mac Performance Monitor
自从发现 Mac Performance Monitor 后我就删除了 iStat Menus 也取消了 mole 常驻菜单栏……

macOS 原生的性能分析器与记录器,常驻菜单栏。它持续记录 CPU、内存压力、GPU、网络、磁盘、电池及各进程的使用情况至本地数据库,并帮助你分析数据:趋势、内存泄漏、压力事件及设备诊断。
完全免费且开源。无遥测功能。所有采样数据均存储在你的 Mac 上。

刚好今天 Mac Performance Monitor 通过了 Homebrew 的审核,可以一键安装了:

brew install --cask mac-performance-monitor

Mac Performance Monitor 的 Changelog 遵循「如何维护更新日志 」和「语义化版本」,看起来就赏心悦目 LOL

Mac Performance Monitor 的更新日志
Mac Performance Monitor 的更新日志

Comments
Write a Comment