三种不同的故障会报同一条 cask 错误消息,而每一种都有自己的恢复路径。可能是已安装版本里缺少厂商的卸载程序,可能是某个辅助进程仍在运行并占用着文件,也可能是软件包收据与磁盘上的实际情况不一致。论坛上那个救过其中一种情况的旧办法,并不能告诉你自己属于哪一种。读取 cask 自己的记录才是查明的方式。

三种看似相同的故障

缺少卸载程序时,cask 尝试运行它便会遇到一个不存在的路径。辅助进程仍在运行时,卸载会先开始然后卡住,或者应用在退出后又重新出现。收据过期时,cask 自己的记录与安装器数据库会对产品是否安装各执一词。

重试之前先把第一条错误原文留下来。第二次尝试会覆盖产生该消息的状态,而原始那一行正是维护者或厂商区分这几种情况所需要的。把它复制到一个能熬过重试的地方。

如果这条 VPN 承载着你赖以工作的连接,请先安排另一条管理通道。移除提供访问的客户端是维护窗口的决定,而不是 Homebrew 的决定。也正是这个顺序,让失败的卸载变成可恢复而不是终局。

读一读 cask 究竟装了什么

Homebrew 自己的视角是最便宜的现成证据,而且它不修改任何东西:

brew info --cask openvpn-connect
brew list --cask openvpn-connect

第一条命令打印 cask 的元数据以及它管理的产物;第二条列出记录为已安装的内容。两者都不能证明机器上的每个辅助进程都与当前配方一致,而这正是旧安装可能以当前 cask 源码未描述的方式失败的原因。把这两份输出当作待核实的主张,而不是关于存在什么的最终结论。

选择路径之前,先把记录的版本与应用自身的版本做比较。版本不一致就能解释卸载程序缺失,而不必牵扯更深的故障,此时答案是升级到 cask 期望的版本,而不是手动清理。

zap 增加了什么,代价是什么

cask 的卸载段落处理配方声明的产物:退出应用、卸载启动任务、移除登录项、遗忘软件包收据并删除应用包。这是正常路径,也是本应奏效的那条。

--zap 是另一种请求。它要求 Homebrew 连用户偏好与共享资源一并删除,文档也警告这可能影响其他软件。在 OpenVPN Connect 的 cask 中,zap 段落会删除 openvpn.keychain-db 并清空用户的应用支持数据,这意味着已保存的凭据与连接配置也会随之消失。如果配置来自组织,请在选这条路之前确认你能重新注册。

ConditionPath that fitsPath to avoid
Uninstaller path missing after an OS upgradeUpgrade the cask to the version matching the appHand-writing a replacement script
Helper still running during removalQuit the app and its menu agent, then retryDeleting the bundle while the helper runs
Receipt exists but files are goneForget the receipt with the cask's own toolingRecursive deletion of the Caskroom entry
You need the machine clean and can re-enrollZap, after reading the stanzaZap on a machine whose profiles you cannot rebuild

看似果断其实不然的路径

写一个以零退出码结束的假 remove.sh 是清单上最糟的选项。它让卸载报告成功,却把启动任务、收据与应用数据留在原处,于是下一次安装继承的是一个半卸载的产品和一份说法相反的记录。

手工删除 Caskroom 目录或应用包,会从另一个方向造出类似的状态。文件消失了,收据还在。此后每条命令都得对着一个不再与自身数据库吻合的机器来推敲。

对整个仓库执行 brew update-reset 是比一次 cask 失败大得多的动作。它为了修一个从来与 tap 状态无关的问题而改变你的 tap 状态,还可能让你去调试与最初不同的 Homebrew。

按顺序决策

按顺序来:读取 cask 记录的产物,比较版本,退出每个正在运行的组件,重试普通卸载,然后才考虑 zap。如果普通路径仍然失败,保留错误,并附上版本号交给 cask 维护者或厂商。

Cask Cookbook 明确指出,软件包安装器需要针对具体产品的卸载手法,而 zap 是可选项且可能删除共享资源。这个框架就是决策规则:先普通卸载,接受凭据代价时才用 zap,手工删除永远不做。

相关文章