Homebrewでphp7.1インストール時のエラー解消法（7.3と共存したいとき）

プロジェクトの環境構築にあたりphp7.1が必要ということで、
Homebrewにてphp7.3と共存環境構築した際のメモ。

いや本当に、<b>ダウングレードって骨が折れる</b>、と思い知ったので
（なるべくならアップデートだけをしていけると平和ですよね）、
同じことで心と時間を消耗する方が1人でも減るように記録を残します。

エラー内容が
`dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.64.dylib`
の方向けの記事になります！

## 環境

- macOS Catalina
- php 7.3（デフォルト）
- zsh

## php@7.1を入れる
### Homebrewインストール
[Homebrew](https://brew.sh/index_ja)をインストールします。
（Homebrewインストールについてはたくさん記事あるので割愛します）

インストールができたら、念の為ドクターコマンドをかけると安心感あります。
ピカピカのmacであれば問題ないでしょう。
不要ファイルや問題がある場合は解決策を示してくれます。

```
% brew doctor
```

### phpのパッケージを探す

```
% brew search php@7
==> Formulae
php@7.2                                 php@7.3                                 php@7.4
```
はい、出てきません。
サポート終わるので、生きてるリポジトリから消されております。
いなくなった@7.1を探しにいきます。

### 墓場（安眠）と接続する

deprecatedされたphp7.1はこちらにいます。

> https://github.com/eXolnet/homebrew-deprecated

「Installation」に記載の通り、下記を実行します。

```
brew tap exolnet/homebrew-deprecated
```
すると、`/usr/local/Homebrew/Library/Taps`以下に、`exolnet`というディレクトリができます。
※`brew tap`で、deprecatedリポジトリをクローンしてきているだけですので、もし「古いのはいらないぜ！」ってなった場合は、このフォルダをまるっと削除すれば墓場との接続は解除されます。

ではもう一度試してみましょう。

```
% brew search php@7
==> Formulae
brew-php-switcher                       php@7.2
exolnet/deprecated/php@5.6              php@7.3 
exolnet/deprecated/php@7.0              phplint
exolnet/deprecated/php@7.1              phpmd
```
出ました。インストールします。

```
% brew install exolnet/deprecated/php@7.1
```

インストールが終わると、ご丁寧にパスを通してね、との旨のアナウンスが出るので、従います。

```
If you need to have php@7.1 first in your PATH run:
  echo 'export PATH="/usr/local/opt/php@7.1/bin:$PATH"' >> ~/.zshrc
  echo 'export PATH="/usr/local/opt/php@7.1/sbin:$PATH"' >> ~/.zshrc
```
こちらを実行すると、`/Users/{ユーザー名}/.zshrc`に

```
export PATH="/usr/local/opt/php@7.1/bin:$PATH"
export PATH="/usr/local/opt/php@7.1/sbin:$PATH"
```
と出力されて、 `php`コマンドをたたいたときに、Homebrewのphp@7.1をむいてくれるようになります。

## php7.1を動かす（せない）
さあ、では別のターミナルを開いて、いざ実行！

```
% php -v
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.64.dylib
  Referenced from: /usr/local/opt/php@7.1/bin/php
  Reason: image not found
zsh: abort      php -v
```
ん。
`dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.64.dylib`
こちらでググったところ、「icu4c（というライブラリ）のv64がないよ」と言われて起動しません。
確認します。

```
% brew list --versions icu4c
icu4c 67.1
```
たしかにないです。はいっているのは67.1です。
先程のphp@7.1インストール時、このicu4cが必要なのでDLがはしってるんですが、
ログをよく見ると、同様のワーニングが出てこけいます。
そう、これまた最新のicu4cでは配布版が67になっちゃっているので、動きません・・！（涙）


### [余談]下記、ダメだったやつ
#### パッケージアップデート説
「`brew reinstall [パッケージ名]`でいけたよ！」
「`brew upgrade`でいけたよ！」
⇒色々あるんですが、Homebrewはいれたてピカピカでしたのでボツ。

#### オプションつける説
「`brew reinstall --build-from-source php@7.1`でいけたよ！」
⇒icu4c 64エラーで怒られた。ボツ。
https://github.com/eXolnet/homebrew-deprecated/issues/27#issuecomment-696179914

#### ロウ（生）データアクセス説
「`brew reinstall https://raw.githubusercontent.com/Homebrew/homebrew-core/a806a621ed3722fb580a58000fb274a2f2d86a6d/Formula/icu4c.rb`で64.2おとせるよ！」
⇒生データは落とさないでと怒られた。ボツ。

```
Error: Calling Installation of XXX from a GitHub commit URL is disabled! Use 'brew extract XXX' to stable tap on GitHub instead. 
```
https://stackoverflow.com/questions/53828891/dyld-library-not-loaded-usr-local-opt-icu4c-lib-libicui18n-62-dylib-error-run/54273234#comment108612038_56242725


## php7.1を動かす（くようにする）

おそらく私と同様の手順は試し尽くして、世界で同様に悩んでいる女性が見つけた答えが。
（Your 2days saves me 💐　と言いたい）

> https://github.com/eXolnet/homebrew-deprecated/issues/27

なに、git使ってゴニョゴニョする・・だと・・？
さらに調べてみると、より詳しく手順を載せてくれている方が。

> https://gist.github.com/sawant/6ea10e45de7d09e966a1dc6afea3bffb

時を戻そう。　←

### 手順詳細

① ターミナルを新規で開く。
② Homebrewのgitディレクトリに移動する。

```
% cd $(brew --prefix)/Homebrew/Library/Taps/homebrew/homebrew-core/Formula
```

③ `git log`で、icu4c.rb関連のログを確認。わさわさと出てくるので、自分が戻りたいバージョンのコミットidを確認。

```
% git log --follow icu4c.rb

commit c179a064276d698d66953898ff9e02d6e0664b2a
Author: BrewTestBot <brew-test-bot@googlegroups.com>
Date:   Wed Aug 15 21:51:09 2018 +0000

    icu4c: update 62.1 bottle.

commit 2235a91cedb2038a7c721796b48e63836c792607
Author: ilovezfs <ilovezfs@icloud.com>
Date:   Tue Jul 24 09:44:31 2018 +0200

    icu4c: remove head spec (#30427)
```

④該当のコミットid時点のブランチから、新規チェックアウトして、ブランチを移動。
`git checkout -b [お好きなブランチ名] [該当のコミットid]`

```
% git checkout -b icu4c-64.2 6d9815xxxxxxxxxxxxxx

Switched to a new branch 'icu4c-64.2'
```

`git branch`で今いるブランチ確認できます。

```
% git branch
* icu4c-64.2
  master
```

⑤icu4c.rbを再インストール

```
% brew reinstall ./icu4c.rb
```
インストールが開始されます。問題なくいけたら、

⑥もともと開いていたターミナルの画面（あるいは新規ターミナル開く）で、icu4cのバージョンを確認

```
brew list --versions icu4c
icu4c 64.2
```
下がった🙌

ということで、新規ターミナルを開いて、`php -v` 実行すると。

```
% php -v
PHP 7.1.33 (cli) (built: Dec 19 2019 11:01:14) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
```
動いた！🎉

※動かない方は、Homebrewのphpが動作してない可能性があるので、
`brew services start php@7.1`など実行してみてください。
使うのを止めたいときは、`brew services stop php@7.1`で止められます。
https://ocws.jp/blog/i-raised-my-macs-php-version-to-7-3/


### 最新の状態に戻る

もし一時的に下げたいということでしたら、7.1で行いたい作業が完了したら、7.3に戻したいですよね。
そのときの手順も念の為書いておきます。

①新規ターミナルを開く
②Homebrewのgitディレクトリへ移動、ブランチ確認

```
% cd $(brew --prefix)/Homebrew/Library/Taps/homebrew/homebrew-core/Formula

% git branch
* icu4c-64.2
  master
```
チェックアウトしたブランチ（過去）にいるはずなので、

③マスターに戻る、（そしてブランチ再確認）

```
% git checkout master

% git branch
  icu4c-64.2
* master
```

ブランチ確認すると、masterブランチに戻っています。
この状態で逆にicu4cが古くてphp7.3が動かないよ！とかなった場合は、

新規ターミナル開いて、

```
% brew reinstall ./icu4c.rb
```
ってしてあげれば最新のicu4cがインストールされます。

```
% brew list --versions icu4c
icu4c 67.1
```

### おわりに
- 私はめぐりめぐってHomebrewのインストールからやり直した民なので、どなたかの救いになればこれ幸い
- ターミナルはバンバン新規で開くのがよろし
- ありがとう世界の開発者たち（の知見）

以上です！