Homebrewで古いバージョンのパッケージをインストールする 2023年版

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:

brew extract automake --version=1.12 <YOUR_GITHUB_USER>/<YOUR_TAP_REPOSITORY_NAME>
Formulae Versions — Homebrew Documentation

上記のドキュメントの通り Tap と brew extract コマンドを使って古いバージョンのパッケージをインストールすることができたので、備忘録として残します。terraform 1.4.6 を例に紹介します。

記事を書くために Terraform を例にしていますが、Terraform の古いバージョンを利用したい場合にはこの記事の方法ではなく tfenv を利用することをおすすめします。

目次

  1. ローカルマシンに Tap 用の Git リポジトリを作成
  2. brew extract で特定のバージョンの Terraform の formula をローカルマシンに展開
  3. brew extract コマンドがうまくいかない場合は
  4. ローカルマシンの Tap からパッケージをインストール
  5. アンインストール

ローカルマシンに 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 にアップグレードされたようです。

ローカルマシンの 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

-技術ブログ
-