Homebrew 卸不掉 OpenVPN Connect:该走哪条路?
cask 卸载失败是三种故障之一。先读取 cask 的产物清单,比较版本,再在重试、升级与 zap 之间做决定。
三种不同的故障会报同一条 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 并清空用户的应用支持数据,这意味着已保存的凭据与连接配置也会随之消失。如果配置来自组织,请在选这条路之前确认你能重新注册。
| Condition | Path that fits | Path to avoid |
|---|---|---|
| Uninstaller path missing after an OS upgrade | Upgrade the cask to the version matching the app | Hand-writing a replacement script |
| Helper still running during removal | Quit the app and its menu agent, then retry | Deleting the bundle while the helper runs |
| Receipt exists but files are gone | Forget the receipt with the cask's own tooling | Recursive deletion of the Caskroom entry |
| You need the machine clean and can re-enroll | Zap, after reading the stanza | Zap 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,手工删除永远不做。