Homebrew で Formula にない任意のバージョンのパッケージをインストールする

TIL
December 13, 2022

Homebrew では、バージョンを指定しなければ、Homebrew Formula の最新バージョンがインストールされる。
過去バージョンが Homebrew Formula に存在する場合は、@ 以降にバージョンを指定すると、指定したバージョンでインストールできる。

# 指定できるバージョンを調べる
# 例は postgresql
$ brew search postgresql@

==> Formulae
postgresql@10       postgresql@12       postgresql@14       postgresql@9.4      qt-postgresql
postgresql@11       postgresql@13       postgresql@15       postgresql@9.5      postgrest
==> Casks
navicat-for-postgresql

# @ 以降にインストールしたいバージョンを指定する
$ brew install postgresql@14

Homebrew Formula に過去バージョンが残されていない場合、上記の方法ではインストールできない。
そのため、インストールするバージョンのスクリプトを指定した Formula をローカルに作成することで、任意のバージョンをインストールする。
ただし、インストールスクリプトを実行するため、Ruby の実行環境が必要である。

動作環境

  • Homebrew v3.6.15

Homebrew 公式で提供されているパッケージをインストールする場合

Homebrew 公式で提供されているパッケージは、Homebrew/homebrew-core で管理されている。

1. ローカルにオリジナルの Formula を作成する

brew tap-new ユーザー名/Formula 名 で新規の Formula を作成する。
Formula 名 は、brew install するときに指定するパッケージ名となる。

たとえば、Go v1.18.5 をインストールしたいとする。

# Go の場合
$ brew tap-new $USER/go

Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/chick-p/homebrew-go/.git/
[main (root-commit) b435276] Create chick-p/go tap
...省略...
==> Created chick-p/go
/usr/local/Homebrew/Library/Taps/chick-p/homebrew-go
...省略...

brew extract --version=インストールするバージョン Formla名 で、過去バージョンのインストールスクリプトを特定する。

$ brew extract --version=1.18.5 go $USER/go

==> Searching repository history
==> Writing formula for go from revision fad51b0 to:
/usr/local/Homebrew/Library/Taps/chick-p/homebrew-go/Formula/go@1.18.5.rb

2. オリジナルの Formula を指定してインストールする

brew install でインストールするパッケージ名に、オリジナルの Formula を指定する。

$ brew install $USER/go/go@1.18.5

==> Fetching chick-p/go/go@1.18.5
...省略...
==> Downloading from https://dl.google.com/go/go1.18.5.src.tar.gz
######################################################################## 100.0%
==> Installing go@1.18.5 from chick-p/go
...省略...

brew tap Formula で追加するパッケージをインストールする場合

Homebrew 公式で提供されていないパッケージをインストールする場合 brew tap して Formula を追加してからインストールする必要がある。
こういったパッケージで特定のバージョンをインストールする場合も、公式で提供されているパッケージをインストールする方法と同じである。
ただし、brew extract で指定する Formula 名には、tap に必要だったパスも記載する必要がある。

たとえば、dart-sass-embbed の場合、brew extract で sass/sass/dart-sass-embedded を指定する。

# dart-sass-embbed v1.56.1 をインストールする例
$ brew tap-new $USER/dart-sass-embedded
$ brew extract --version=1.56.1 sass/sass/dart-sass-embedded $USER/dart-sass-embedded
$ brew install $USER/dart-sass-embedded/dart-sass-embedded@1.56.1

インストールできたことを確認する。

$ dart-sass-embedded --version

{
  "protocolVersion": "1.2.0",
  "compilerVersion": "1.56.1",
  "implementationVersion": "1.56.1",
  "implementationName": "Dart Sass",
  "id": 0
}