Homebrew で古いバージョンのパッケージを利用したいことがあったので、調べたことの備忘録です。2023 年 11 月時点で動作確認が取れた方法です。Homebrew のバージョンは 4.1.22-4 です。
Formulae Versions — Homebrew Documentation に特定のバージョンのパッケージをインストールする方法について記載があります。
ドキュメントによるとbrew pin
コマンドは使うべきではなく、代わりに独自の tap を作り、
Homebrew’s versions should not be used to “pin” formulae to your personal requirements. You should instead create your own tap for formulae you or your organisation wish to control the versioning of, or those that do not meet the above standards.
Formulae Versions — Homebrew Documentation
その後brew extract
コマンドを使って、カスタム Tap に希望するバージョンの formula をコピーせよ、とのこと。ただし、過去の formula に存在したバージョンである必要があるようです。
If there is a formula that currently exists in the Homebrew/homebrew-core repository or has existed in the past (i.e. was migrated or deleted), you can recover it for your own use with the
brew extract
command. This will copy the desired version of the formula into a custom tap. For example, if your project depends on automake 1.12 instead of the most recent version, you can obtain the automake formula at version 1.12 by running:Formulae Versions — Homebrew Documentationbrew extract automake --version=1.12 <YOUR_GITHUB_USER>/<YOUR_TAP_REPOSITORY_NAME>
上記のドキュメントの通り Tap と brew extract
コマンドを使って古いバージョンのパッケージをインストールすることができたので、備忘録として残します。terraform 1.4.6 を例に紹介します。
記事を書くために Terraform を例にしていますが、Terraform の古いバージョンを利用したい場合にはこの記事の方法ではなく tfenv を利用することをおすすめします。
目次
- ローカルマシンに Tap 用の Git リポジトリを作成
- brew extract で特定のバージョンの Terraform の formula をローカルマシンに展開
- brew extract コマンドがうまくいかない場合は
- ローカルマシンの Tap からパッケージをインストール
- アンインストール
ローカルマシンに Tap 用の Git リポジトリを作成
以下のコマンドでローカルマシンに Tap 用の Git リポジトリを作成します。コマンドの説明は brew Manpage#tap-newを参照。
brew tap-new karakaram/homebrew-taps
Tap とは Homebrew が提供する公式の formula に存在しないソフトウェアをインストールする場合に利用するものです。詳細は Taps (Third-Party Repositories) — Homebrew Documentation を参照。
Github にはプッシュしないのでリポジトリ名は何でもよいです。自分の GitHub の username など重複しにくいものをつけておきましょう。Taps (Third-Party Repositories) — Homebrew Documentation によると Tap 用のリポジトリ名は homebrew-taps にするように書いてあるので、ルールに従います。
実行結果。/opt/homebrew/Library/Taps/karakaram/homebrew-taps
ディレクトリに Git リポジトリが作成されました。
Initialized empty Git repository in /opt/homebrew/Library/Taps/karakaram/homebrew-taps/.git/
...
==> Created karakaram/taps
/opt/homebrew/Library/Taps/karakaram/homebrew-taps
...
brew tap
コマンドを実行すると。
brew tap
tap が追加されたことを確認することができます。
karakaram/taps
brew extract で特定のバージョンの Terraform の formula をローカルマシンに展開
brew extract
コマンドで、Terraform v1.4.6 の formula をさきほど作成したリポジトリに展開します。brew extract
コマンドは、リポジトリの履歴から指定したバージョンの formula を探し、Tap にコピーを作成するコマンドです。詳細は brew Manpage#extract を参照。
brew extract terraform --version=1.4.6 karakaram/taps
エラーが出てきました。
Error: No available formula with the name "homebrew/core/terraform".
Please tap it and then try again: brew tap homebrew/core
エラーメッセージの通りに brew tap
コマンドを実行します。私が試したときには 500 MB ほどのデータがダウンロードされたので、通信速度が高速な場所でやりましょう。
brew tap homebrew/core
ダウンロードが終わったら再度 brew extract
コマンドを実行します。
brew extract terraform --version=1.4.6 karakaram/taps
今度はうまくいって、/opt/homebrew/Library/Taps/karakaram/homebrew-taps/Formula/terraform@1.4.6.rb
に formula がコピーされました。
==> Searching repository history
==> Writing formula for terraform from revision 7517ca0 to:
/opt/homebrew/Library/Taps/karakaram/homebrew-taps/Formula/terraform@1.4.6.rb
brew extract コマンドがうまくいかない場合は
指定したバージョンが過去の formula に存在しない可能性があります。たとえば Terraform だと 1.4.7 を extract しようとするとエラーがでます。
その場合は https://github.com/Homebrew/homebrew-core から formula のファイルを探し、そのファイルのコミットログから指定されたバージョンが過去に存在したかを確認します。Terraform では以下のコミットで 1.4.6 にアップグレードされたようです。
- https://github.com/Homebrew/homebrew-core/commit/a6a332e75e127f456a2f011e19c3b5dc89a85072
- https://github.com/Homebrew/homebrew-core/commit/7517ca039b8d9d81cc397d562c77e18e5f7c6b64
ローカルマシンの Tap からパッケージをインストール
以下のコマンドでローカルマシンの Tap を指定してパッケージをインストールします。
brew install karakaram/taps/terraform@1.4.6
実行結果。Terraform の 1.4.6 がインストールできました。
==> Downloading https://formulae.brew.sh/api/cask.jws.json
==> Downloading https://formulae.brew.sh/api/formula.jws.json
==> Fetching karakaram/taps/terraform@1.4.6
==> Downloading https://github.com/hashicorp/terraform/archive/v1.4.6.tar.gz
==> Downloading from https://codeload.github.com/hashicorp/terraform/tar.gz/refs/tags/v1.4.6
-#O=- # # #
==> Installing terraform@1.4.6 from karakaram/taps
==> go build -ldflags=-s -w
🍺 /opt/homebrew/Cellar/terraform@1.4.6/1.4.6: 6 files, 69.5MB, built in 48 seconds
==> Running `brew cleanup terraform@1.4.6`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
インストールしたパッケージのバイナリは /opt/homebrew/bin/terraform@1.4.6
にあります。 terraform@1.4.6 というコマンドで利用ができます。
terraform@1.4.6 version
Terraform v1.4.6
on darwin_arm64
アンインストール
terraform@1.4.6 をアンインストール。
brew uninstall karakaram/taps/terraform@1.4.6
Tap を削除。
brew untap homebrew/core
brew untap karakaram/taps