豆腐とコンソメ

豆腐とコンソメ

もろもろのプログラム勉強記録

OSXでローカルのPHPが実行できなくなった際のメモ

事象

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