Carpe Diem

備忘録

Homebrewで過去のバージョンを使いたい【tap版】

概要

以前以下の記事でhomebrewの過去バージョンの使い方を紹介しました。

christina04.hatenablog.com

あれからHomebrewも変わり、以前の方法ではうまくいかなくなったため新しい過去バージョンのインストール方法を紹介します。

環境

  • macOS Catalina 10.15.6
  • Homebrew 2.5.2

課題

以下の課題により以前の手法が使えなくなりました。

brewは最新版しか保持しない方針

Homebrew automatically uninstalls old versions of a formula after that formula is upgraded with brew upgrade, and periodically performs additional cleanup every 30 days.

FAQ — Homebrew Documentation

とあるように、brew upgrade時に最新版以外は削除されます。またupgradeを使わなくても30日ごとのcleanupで削除されます。

export HOMEBREW_NO_INSTALL_CLEANUP=1

を設定すれば削除されなくなりますが、brewの方針として最新バージョン以外サポートしないようです。

なので基本的にbrew switchによるバージョン変更はできないものと考えます。

brew install formula_raw_pathも使えなくなった

How to Install an Older Brew Package | by Nassos Michas | ITNEXT

で紹介されているようにhomebrewのgitのコミットハッシュを使って

$ brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/35e6655f86a253e44648060df15c93b0867f5e14/Formula/circleci.rb
Error: Calling Installation of circleci from a GitHub commit URL is disabled! Use 'brew extract circleci' to stable tap on GitHub instead.

のように過去バージョンをインストールする手段がありました。しかし現在のbrewでは以下のように怒られます。

Error: Calling Installation of xxx from a GitHub commit URL is disabled! Use 'brew extract xxx' to stable tap on GitHub instead.

対応方法

brew extract旧バージョンのformulaを独自tapに登録してそこからインストールします。

例としてcircleci-cliの旧バージョンをインストールします。
現時点の最新版は0.1.9578ですが、過去のバグが再発していたため0.1.9066に戻します。

1. tap用リポジトリの用意

githubで空リポジトリを用意するか、tap-newで用意します。今回はtap-newで。

今回はjun06t/homebrew-tapsというリポジトリにします。名前は任意です。ちなみにtapの命名規則としてhomebrew-を省略できます。

$ brew tap-new jun06t/taps

==> Created jun06t/taps
/usr/local/Homebrew/Library/Taps/jun06t/homebrew-taps

2. brewの古いformulaをtapに展開

brew extractで公式のformulacircleciを先程用意したtapへ展開します。
その際に--versionオプションでインストールしたい旧バージョンを指定します。

$ brew extract circleci jun06t/taps --version 0.1.9066

==> Searching repository history
==> Writing formula for circleci from revision 35e6655 to:
/usr/local/Homebrew/Library/Taps/jun06t/homebrew-taps/Formula/circleci@0.1.9066.rb

3. tapからインストール

$ brew install jun06t/taps/circleci@0.1.9066

Updating Homebrew...
==> Installing circleci@0.1.9066 from jun06t/taps
==> Cloning https://github.com/CircleCI-Public/circleci-cli.git
Updating /Users/jun06t/Library/Caches/Homebrew/circleci@0.1.9066--git
==> Checking out tag v0.1.9066
HEAD is now at 8a3435b Unhide `orb pack` (#445)
HEAD is now at 8a3435b Unhide `orb pack` (#445)
==> make pack
==> go build -ldflags -s -w -X github.com/CircleCI-Public/circleci-cli/version.packageManager=homebrew -X github.com/CircleCI-Public/circleci-cli/version.Version=0.1.9066 -X github.com/CircleCI-Public/circleci-cli/version.Commit=8a3435b /
🍺  /usr/local/Cellar/circleci@0.1.9066/0.1.9066: 5 files, 12.6MB, built in 21 seconds

これで古いバージョンをインストールできました。

$ circleci version
0.1.9066+8a3435b (homebrew)

アンインストールは

$ brew uninstall circleci@0.1.9066

Uninstalling /usr/local/Cellar/circleci@0.1.9066/0.1.9066... (5 files, 12.6MB)

とすればOKです。

参考