事象
homebrewでなにかしらのアップデートを行った後に、ふとphpを実行すると以下のエラーとなった。
> php -v
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicuio.67.dylib
Referenced from: /Users/yamauchiryouji/.phpenv/versions/7.4.7/bin/php
Reason: image not found
zsh: abort php -v
/usr/local/opt/icu4c/lib
を確認すると、たしかに依存してるライブラリlibicuio.67.dylib
が消えており、libicuio.69.dylib
になってしまっていた。
> ls /usr/local/opt/icu4c/lib/
icu libicuio.69.1.dylib libicutu.69.dylib
libicudata.69.1.dylib libicuio.69.dylib libicutu.a
libicudata.69.dylib libicuio.a libicutu.dylib
libicudata.a libicuio.dylib libicuuc.69.1.dylib
libicudata.dylib libicutest.69.1.dylib libicuuc.69.dylib
libicui18n.69.1.dylib libicutest.69.dylib libicuuc.a
libicui18n.69.dylib libicutest.a libicuuc.dylib
libicui18n.a libicutest.dylib pkgconfig
libicui18n.dylib libicutu.69.1.dylib
対応
homebrewで過去のパッケージをインストールする。
お手軽そうなbrew swtich
や、homebrewのリポジトリのcommitidを指定たURLからのインストールはできなくなったとのことなので、tapという機能を使う。
こちらを参考にさせていただいた。
christina04.hatenablog.com
ローカルにhomebrewから参照できるリポジトリを作成する。
> brew tap-new ryomasao/taps
Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/ryomasao/homebrew-taps/.git/
[master (root-commit) 77a0f36] Create ryomasao/taps tap
3 files changed, 88 insertions(+)
create mode 100644 .github/workflows/publish.yml
create mode 100644 .github/workflows/tests.yml
create mode 100644 README.md
==> Created ryomasao/taps
/usr/local/Homebrew/Library/Taps/ryomasao/homebrew-taps
インストールしたいパッケージをhomebrewのリポジトリから抽出して、自分のリポジトリに登録する。
今回利用したいicu4cのversionも指定する。
> brew extract icu4c ryomasao/taps --version 67
インストール。
> brew install ryomasao/taps/icu4c@61
これでいける!と思ったら、別バージョンのicu4cが別のディレクトリに配置されていた。
lrwxr-xr-x 1 yamauchiryouji admin 20 5 21 15:22 icu4c -> ../Cellar/icu4c/69.1
lrwxr-xr-x 1 yamauchiryouji admin 23 5 21 15:55 icu4c@67 -> ../Cellar/icu4c@67/67.1
既存の69.1を置き換えた場合、そっちに依存してる何かが起動しなくなるの恐れがあったので、/usr/local/opt/icu4c/lib
配下に別バージョンへのシンボリックリンクを貼ることで解決できた。
libicuio.67.dylib -> ../../../icu4c@67/67.1/lib/libicuio.67.1.dylib
libicui18n.67.dylib -> ../../../icu4c@67/67.1/lib/libicui18n.67.1.dylib
libicuuc.67.dylib -> ../../../icu4c@67/67.1/lib/libicuuc.67.1.dylib
libicudata.67.dylib -> ../../../icu4c@67/67.1/lib/libicudata.67.1.dylib