brew-cask でのインストール先を変更する際に発生するシンボリックリンクの問題


Caskroom の場所の変更

Caskroom の場所が /opt/homebrew-cask/Caskroom から /usr/local/Caskroom へ変更

brew cask doctor などで以下の Warning を確認.

==> Homebrew-cask Install Location:
<NONE>
Warning: The default Caskroom location has moved to /usr/local/Caskroom.

Please migrate your Casks to the new location, or if you would like to keep your
Caskroom at /opt/homebrew-cask/Caskroom, add the following to your HOMEBREW_CASK_OPTS:

  --caskroom=/opt/homebrew-cask/Caskroom

For more details on each of those options, see https://github.com/caskroom/homebrew-cask/issues/21913.

Warningの内容から対応としては以下の二択.

  • --caskroom=/opt/homebrew-cask/Caskroom オプションを付けて従来の場所(/opt/homebrew-cask/Caskroom)を使用
  • /opt/homebrew-cask/Caskroom から /usr/local/Caskroom へファイルを移行

ファイル移行時に生じた問題

GitHubのIssues では簡単な移行方法として

mv /opt/homebrew-cask/Caskroom /usr/local

を紹介していたが,実行すると brew-cask で入れたものが使用不可.

目に見えた症状としては,以下の通り.

  • Lanchpad,Dock で app が見つからない
  • Alfred から app が見つからず,はてなマークが出ている

brew-cask で入れた app のシンボリックリンクの参照先を変更していないのが原因.

解決策

以下の手順により,問題は解決.

シンボリックリンクを修正.

以下のシェルスクリプトを実行.
IFS(区切り文字)を関数のスコープの中で収めて無名関数として実行(zsh).

() {
  local IFS=$'\n'
  local cask_app_symboliclink_dir=$HOME/Applications
  local old_room=/opt/homebrew-cask
  local new_room=/usr/local

  for dest in `\ls -d $cask_app_symboliclink_dir/*.app`; do
    if [ -h $dest ]; then
      src=`readlink $dest | sed -e "s@$old_room@$new_room@"`
      sudo ln -sf $src $dest
    fi
  done
}

Lanchpad および Dock の正常動作確認.

Alfred の設定を修正

次に Alfred を起動.Lanchpadから,またはopen "/usr/local/Caskroom/alfred/<お使いのversion>/Alfred 2.app/Contents/Preferences/Alfred Preferences.app" で Alfred Preferences が起動.

  1. Features -> Search Scope の +ボタン をクリック
  2. Command + Shift + G で /usr/local/Caskroom を入力,追加
  3. /opt/homebrew-cask/Caskroom にカーソルを合わせて delete キーで削除

Alfred の正常動作確認.

以上で新しい Caskroom への移行完了.