三つの異なる不具合が同じ cask のエラーメッセージをまとっていますが、それぞれに固有の復旧経路があります。インストール済みのバージョンにベンダーのアンインストーラが欠けている場合もあれば、ヘルパーがまだ動作してファイルを掴んでいる場合もあり、パッケージのレシートがディスク上の状態と食い違っている場合もあります。そうした事例の一つを救った古いフォーラムの回避策は、あなたの環境がどれなのかを何も教えてくれません。cask 自身の記録を読むことが、それを見分ける方法です。

似て見える三つの失敗

アンインストーラが欠けている場合は、cask がそれを実行しようとしたときに存在しないパスとして現れます。ヘルパーが動いている場合は、削除が始まってから止まる、あるいはアプリを終了した後に再び現れる形で表れます。レシートが古い場合は、cask 自身の記録とインストーラのデータベースが、そもそも製品がインストールされているかどうかで一致しないときに現れます。

何かを再試行する前に、最初のエラー文を保存してください。二度目の試行はそのメッセージを生んだ状態を上書きしてしまい、元の行こそがメンテナやベンダーがこれらの事例を区別するために必要なものです。再試行を生き延びる場所にコピーしておきます。

この VPN が作業用の接続を担っているなら、先に別の管理経路を用意してください。アクセスを提供しているクライアントを外すのは、Homebrew ではなくメンテナンス時間帯についての判断です。その順序こそが、削除の失敗を最終的なものではなく復旧可能なものにします。

cask が実際に何をインストールしたかを読む

Homebrew 自身の表示は入手できる最も安価な証拠であり、何も変更しません:

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

最初のコマンドは cask のメタデータとそれが管理するアーティファクトを表示し、二つ目はインストール済みとして記録されているものを一覧します。どちらも、マシン上のすべてのヘルパーが現在のレシピと一致することを証明するものではなく、だからこそ、古いインストールは現在の cask のソースが説明しない形で失敗し得ます。二つの出力は確認すべき主張として扱い、何が存在するかについての最終的な答えとは考えないでください。

経路を選ぶ前に、記録されたバージョンとアプリ自身のバージョンを比較してください。食い違いがあれば、より深い不具合がなくてもアンインストーラの欠落を説明でき、答えは手作業の掃除ではなく cask が期待するバージョンへのアップグレードです。

zap が加えるものと、その代償

cask の削除 stanza は、レシピが宣言するアーティファクトを扱います:アプリを終了し、起動ジョブをアンロードし、ログイン項目を削除し、パッケージのレシートを忘れ、アプリケーションバンドルを削除します。これが通常の経路であり、本来機能すべきものです。

--zap は別の要求です。ユーザー設定と共有リソースも削除するよう Homebrew に求め、ドキュメントはこれが他のソフトウェアに影響し得ると警告しています。OpenVPN Connect の cask では、zap の stanza が 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、手作業の削除は決して行わない。

関連記事