homebrewアップデートで、依存するライブラリが使えなくなった際の解決方法

こんにちは!ドイです。
今回は、homebrewをアップデートしたところ、PHPが実行できなくなったので、解決していきます。

現象

PhpStormで、PHP_CodeSnifferが実行できなくなりました。

上部メニューから、PhpStorm > settings > PHP > 品質ツール > PHP_CodeSnifferまで進み「…」をクリックします。
モーダルが表示されるので、「検証」ボタンをクリックすると「Can not run PHP Code CodeSniffer」とエラーが表示されました。
確かに、PHP_CodeSnifferが動いていないようです。

再度上部メニューから、PhpStorm > settings > PHP > Composerまで進み、「エディターで開く」をクリックします。
composer.jsonが開かれるので、右上にある「更新」ボタンをクリックしたところ、下記のエラーが表示されました。

エラー内容

phpcs: dyld[1987]: Library not loaded: /usr/local/opt/icu4c/lib/
Referenced from: <7B63F142-9B23-30AF-A072-888CEB24F99E>
/usr/local/Cellar/php@7.4/7.4.33/bin/php Reason: tried:
'/usr/local/opt/icu4c/lib/libicuio.71.dylib' (no such file)

ターミナルを開いて、cdコマンドで /usr/local/opt/icu4c/lib/に移動します。
lsコマンドで、「no such file」と言われているファイルが存在しないか確認します。

libicuio.71.dylibは存在しておらず、代わりにlibicuio.74dylibがありました。
他のファイルも同様でした。homebrewをアップデートしたことで、icu4cが74.2に上がってしまったようです。

依存しているライブラリがないことにはどうにもならないので、
brewでicu4cの71を入れ直して、シンボリックリンクを貼っていきたいと思います。

icu4cの71をインストールしたいのですが、brewは最新版しか保持できません。 tapコマンドで、最新版でない(今回の場合icu4c 71)バージョンを落としてきて、tapからインストールしていきます。

手順①:tap用のリポジトリを作成する

brew tap-new {icu47}/taps

{icu47}となっている箇所は、任意の名前でOKです。
下記の手順で{icu47}と書いている箇所は、同様に任意の名前なので、ここで指定した名前を当てはめてください。

手順②: tapにインストールしたいバージョンを展開する

brew extract icu4c {icu47}/taps --version 71

手順③: tapからインストールする

brew install {icu47}/taps/icu4c@71

ターミナルを開いて、cdコマンドで/usr/local/opt/icu4cに移動すると、同階層にicu4c@71があるかと思います。
これでicu4cの71がインストールできました。

手順④: シンボリックリンクを貼る

ライブラリが依存しているバージョンをインストールできたので、シンボリックリンクを貼ります。

今回は/usr/local/opt/icu4c/lib/にlibicuio.71.dylibがないと怒られているので、
/usr/local/opt/icu4c/lib/の下に、libicuio.71.dylibを作成して、実際にlibicuio.71.dylibがあるパスを指定します。

ターミナルで、cdコマンドで/usr/local/opt/icu4c/libに移動します。
シンボリックリンクを貼るには、ln -s [見にいきたいファイルのパス] [リンク元のパス]なので

ln -s /usr/local/opt/icu4c@71/lib/libicuio.71.dylib libicuio.71.dylib
ln -s /usr/local/opt/icu4c@71/lib/libicui18n.71.dylib libicui18n.71.dylib
ln -s /usr/local/opt/icu4c@71/lib/libicuuc.71.dylib libicuuc.71.dylib
ln -s /usr/local/opt/icu4c@71/lib/libicudata.71.dylib libicudata.71.dylib

シンボリックリンクが貼られたか確認するには、ls -lを叩きます。
このようになっているかと思います。

libicuio.71.dylib -> /usr/local/opt/icu4c@71/lib/libicuio.71.dylib

PHP_CodeSnifferが実行されるか確認するために、上部メニューから、PhpStorm > settings > PHP > 品質ツール > PHP_CodeSnifferまで進み「…」をクリックします。
「検証」ボタンをクリックすると「OK, PHP_CodeSniffer version 3.5.8」と表示されました。
PHP_CodeSnifferが動くことを確認できました!

まとめ

解決方法は
手順①:tap用のリポジトリを作成する
手順②: tapにインストールしたいバージョンを展開する
手順③: tapからインストールする
手順④: シンボリックリンクを貼る

のように単純なのですが、合間合間に関係のないエラーが何回かあったので、スムーズにいきませんでした。
おそらくこの記事に辿り着いた方も同様にスムーズにいかないかもしれませんが、エラーメッセージを読めば何をすればいいのか書いてあるので、根気よくいきましょう。