Tips

Homebrewで過去バージョンのアプリをインストールする方法

Homebrewで何かをインストールする場合、デフォルトでは最新のバージョンがインストールされます。訳あって過去のバージョンのものをインストールしたい場合の説明がネット上に少なかったので記載しておきます。

ライセンスを持っている古いSketchを使いたかった

最近Macを買い替えたのですが、アプリは移行アシスタントを使わずに一つ一つインストールし直すことにしました。Sketchというデザインアプリを使っているのですが、以前は買い切りでずっと使えていたのですが、最近のバージョンはサブスクリプションになっていました。最低限の機能が使えれば良いので、追加の費用を払って最新バージョンにするのも嫌だったので、元々使っていたバージョンをインストールすることにしました。

そのバージョンのインストール用のdmgファイルは普通に公式サイトからダウンロードできるので、手動でインストールするのは簡単です。でも今回のMacからはHomebrewでインストールにこだわりたいと思っていました。

前のMacではCUIアプリはhomebrewでインストールしていましたが、GUIアプリはHomebrewを使うものもあればそうでないものもあり、中途半端な管理をしていました。でも、今回のMacからはhomebrewでインストールできるものは必ずhomebrewでインストールして、一元化しようと考えていました。

Formulaeを対象のリビジョンに戻す

いくつかネットに載っていたやり方を試したのですが、以下が最も参考になりました。

brewで過去のバージョンをinstallしたいンゴ

でも完全にこの通りやっても上手く行かなかったので、結局これを応用して自分でやり方を考えました。使ったバージョンを記載します。

Mac OS 13.0(22A380)
Homebrew 3.6.18

まずFormulaeがあるディレクトリに移動します。(Caskの場合はFormulaeと呼ばないのかな?)

homebrewのcoreに入っているアプリなら /opt/homebrew/Library/Taps/homebrew/homebrew-core/Formula となります。ここでlsをする場合はとんでもない数のファイルが表示されてしまうので注意しましょう。念のため対象のアプリのフォーミュラが存在しているか確認します。sketchという部分はFormulae名なので、対象のものに置き換えてください。

git logで対象のコミットをかくにんします。私の欲しいバージョンは51.3なので、7行目となります。このコミットIDをメモります。

Formulaeを対象のリビジョンに戻します。

中身を確認してしてversionが狙ったものになってるか確認します。

自動アップデートせずにインストールする

1行目について説明します。通常 brew installすると、自動的に先に brew update が走ってしまいます。そうすると、せっかく狙っているリビジョンに戻したFormulaeがまた最新のものになってしまい、狙ったバージョンではなく最新版のアプリがインストールされてしまいます。なので、 HOMEBREW_NO_AUTO_UPDATE=1 をつけて brew update が走らないようにします。次の記事を参考にしました。

Mac Homebrewのbrew tapでも自動アップデートがかかって余計な出力が出るので注意

バージョンを固定する

Homebrewは何かと勝手にアップデートしようとしてくるので、せっかく狙ったバージョンのアプリを最新版にされないために固定します。ここからは次の記事を参考、というかそのままやりました。

HomebrewでCaskのバージョンを固定する方法

Homebrewのcoreに入っているアプリなら、

で行けますが、今回はCaskに入っているアプリなのでこれができません。

なので、Caskを管理するためのツールをインストールします。

brew tap でインストールできるというのがよくわからないですが、これで使えるようになります。

以下で固定されます。

確認するには、

とします。

残る疑問、アンインストール時はどうなるの?

HomebrewのFormulaeは何かと自動的にアップデートされる仕組みになっているので、sketch.rbもすぐに最新版になってしまうと思います。でも、Formulaeには以下の16〜25行目のようにアンインストール時の処理も記載されています。設定ファイルなどを削除する処理のようです。

当然このあたりの処理もバージョンによって違いうるということだと思います。なので、このファイルが現在インストールされているバージョンと齟齬があった場合、適切にアンインストール時の処理がされるのだろうか?という疑問が残りました。

インストールされているFormulaeがどこかに保存されていて、アンインストール時に使われるのかと思ったけど、見当たりませんでした。

まぁ、基本的にこの辺りの設定ファイルが消されなかったとしても、ゴミが残るだけで大した問題はないと思いますし、より新しいバージョンにアップグレードする場合は、上書かれるというとだと思うので大きな問題はないはずですが、ちょっと気持ち悪いですね。

今後この辺りのHomebrewの細かい挙動を理解できればと思います。

他に試した方法

Homebrew Cask で特定のバージョンを指定してインストールする

この方法はうまく行かなかった。

とあるが、 tmp.rb のような適当なファイル名じゃダメで、以下の記事のように

Homebrew: How do you specify a version using brew cask?

のようなファイル名にしなければなりません。また --cask が無いと余計なエラーの表示が出ます。エラーが出てもよしなにインストールはしてくれます。

とはいえ、これはわざわざFormulaeのファイルを手動でダウンロードしてくるやり方なので、私が前述した方法の方がスマートだと思います。