はじめに

なぜか開発で MySQL の 5.7 (現在の最新バージョンは 8.0.2)を利用することになったので、久々に Homebew で switch しようとしたらできなかった。今までバージョンの切り替えをやってこなかった故の知識不足と思いきや、Deprecated にして新しいものを作る流れで消えてしまうクソパターンだった。端的に言うと、 簡単にバージョンを変更できなくなった 。改悪ですね(ため息) 。また、新しい MacBook に変えてしまったので過去のバージョンはローカル環境からすべて消失している。流石に困ったのでググった。

Homebew の git を操る

解決する方法として今後の切り替え作業が楽になる方法は、 Homebew の git のバージョンを切り替えてインストールする方法だ。

Homebew のローカル git リポジトリ

ローカルリポジトリがどこにあるかというと、

/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula

このディレクトリに *.rb ファイルがたくさん存在する。今回の場合は mysql.rb だ。他にも似たようなものがたくさんあるので間違えないようにしよう。

切り替えたいバージョンを探す

おそらくこのコマンドで出てくるだろう。ローカルリポジトリに移動しているなら、 git log master -- Formula/mysql.rb で見るのもいいが面倒なので、 Homebew が提供している方法を利用する。

brew log mysql --oneline

ただし、 Homebew のリポジトリは最新の履歴だけを取得する shallow clone なので、古いものは unshallow する必要がある。

出力結果

左に並ぶ謎の文字列がハッシュ値。 おそらく、 5.7 の最新であろう a340bfac3 をターゲットにする予定。

Warning: homebrew/core is a shallow clone so only partial output will be shown.
To get a full clone run:
  git -C "\$(brew --repo homebrew/core)" fetch --unshallow
cb149358e mysql: fix detection that post-install has already been run
b09bacb6f mysql: update 8.0.12 bottle.
a398fcff1 mysql 8.0.12
bd993938b mysql: update 8.0.11 bottle.
353c77eee mysql 8.0.11
512758e6e Rubocop 0.57.1 style fixes (#28754)
144028de1 mysql: remove duplicate test conditional
a340bfac3 mysql: update 5.7.22 bottle.
4eba79081 mysql 5.7.22
b578b6b88 mysql 8.0.4-rc (devel) (#24506)
df41e9b23 mysql: update 5.7.21 bottle.
e0208bdc0 mysql 5.7.21
ceaf0f37d mysql: update 5.7.20_1 bottle.
a8ae3bf54 mysql: remove unused options and reorder args
a08411131 mysql 8.0.3-rc (devel) (#20538)
ec2da05a0 Indentation style fixes (#19679)
16ebe5f18 Use “squiggly” heredocs.
46bdcd3bd mysql: update 5.7.20 bottle.
06793449d mysql 5.7.20
a0c075899 mysql: update 5.7.19 bottle.
ca053da48 mysql: update 5.7.19 bottle.
707af59f5 mysql 5.7.19
6b31936ee (grafted) bazel: update 0.5.2 bottle.

切り替え方法

git なので普通に checkout します。

git checkout a340bfac3  # a340bfac3 は切り替えたいハッシュ値

処理手順

pushd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula
# a340bfac3 mysql: update 5.7.22 bottle. という情報を取得。
brew log mysql --oneline  
# 5.7.22 が最新バージョンとなるコミットに切り替え。
git checkout a340bfac3
# 既にインストールしている場合
brew uninstall mysql
#  HOMEBREW_NO_AUTO_UPDATE を 1 にしないと自動更新される
HOMEBREW_NO_AUTO_UPDATE=1 brew install mysql
popd

おわりに

不便だ!

今後の利便性なんかどうでもいいなら

brew install mysql@5.7

でもいい。

ただ、 brew switch mysql 5.7.22brew switch mysql 8.0.2 で切り替えたいなら今回示した方法がいいだろう。

参考文献