5.2 自更新应用、--greedy 与 --adopt

原文链接: https://docs.brew.sh/FAQ

自更新应用带来的问题

很多 macOS 应用会在 Homebrew 之外自行更新,例如浏览器、聊天工具等。应用自己的更新器可能让“Homebrew 的记录”比“实际安装的应用”更旧。如果 brew 盲目按记录覆盖安装,反而可能把应用降级。

为此,会自更新的 cask 在定义中声明 auto_updates true。对于安装了可读 app bundle 的版本化 cask,Homebrew 会比较 app bundle 的版本元数据与 cask 当前版本:

  • 应用看起来更旧 → 默认 brew upgrade 会包含该 cask;
  • 应用看起来同版本或更新 → 默认跳过;
  • 无法可靠比较(或使用 version :latest 的 cask)→ 普通 brew upgrade 跳过,避免瞎猜。

强制 Homebrew 也更新它们:–greedy

1
brew upgrade --greedy

--greedy 是范围最大的选项,会把默认检查跳过的自更新 cask 与 version :latest cask 一并纳入。更精确的选项:

1
2
brew upgrade --greedy-auto-updates  # 只包含 auto_updates 的 cask
brew upgrade --greedy-latest        # 只包含 version :latest 的 cask

对于 version :latest 的 cask,brew 会重新下载当前产物,并在可能时把 SHA-256 与安装时记录比对;文件没变则跳过重装。

还可以用环境变量让某些策略持久生效:

1
2
export HOMEBREW_UPGRADE_GREEDY=1                    # 所有 cask 升级都按 greedy 处理
export HOMEBREW_UPGRADE_GREEDY_CASKS="firefox opera" # 只对列出的 cask 生效

如果只想彻底退出自更新 cask 的自动升级:

1
export HOMEBREW_NO_UPGRADE_AUTO_UPDATES_CASKS=1

该设置不影响显式 --greedy/--greedy-auto-updates 的升级。

Dock 位置与权限设置丢失问题

用 brew upgrade 更新 cask 应用时,Homebrew 有两种策略:

  1. 卸载旧版并重装新版:macOS 会认为应用被删除,于是移除 Dock/Launchpad 位置、权限等内部元数据;
  2. 原地替换内容:把升级当作应用原位升级,保留上述设置。

Homebrew 在拥有必要权限时默认采用原地替换。从 macOS Ventura 开始,执行原地升级要求运行 Homebrew 的终端应用获得“App 管理”或“完全磁盘访问权限”中的一种。若你在升级后丢失 Dock 顺序或权限设置,请在“系统设置 → 隐私与安全性”中授予终端相应权限后重试。

把已手动安装的应用“收养”进 brew:–adopt

如果某应用你早就从官网手动装好了,现在想让它进入 brew 的管理范围(例如为了统一升级和 Brewfile 快照),不要先卸载再安装,直接收养:

1
brew install --cask --adopt textmate

输出会显示 “Adopting existing App at ‘/Applications/TextMate.app’”,之后该应用就由 cask 记录管理。

提示:收养前建议先备份或确认版本匹配。完整示例见官方 Tips and Tricks 页面。