🍺

Homebrewで任意のバージョンのパッケージをインストールするシェルスクリプト

に公開

https://zenn.dev/itouuuuuuuuu/articles/a4227c9f25b82a
上記の記事に書かれている手順を行うことで、Homebrewで任意のバージョンのパッケージをインストールできますが、操作手順が煩雑な印象があります。
これをコマンド一つでできるようにするシェルスクリプトを紹介します。

前提

gh コマンドが必要なので brew install gh でインストールしておきます。

インストール用シェルスクリプト

シェルスクリプト

brew_install_specific_version.sh
#!/usr/bin/env bash
set -xe -o pipefail

package_name="$1"
package_version="$2"
user_name="$(whoami)"
formura_name="$package_name@$package_version"
tap_name="$user_name/$formura_name"

# ローカルにtapを作成する
brew tap-new "$tap_name"

repo_name=Homebrew/homebrew-core
remote_formula_path="Formula/${package_name:0:1}/$package_name.rb"

# formulaのコミットを見ていく
while IFS= read -r commit_sha; do
  formula_code="$(gh api "repos/$repo_name/contents/$remote_formula_path?ref=$commit_sha" --jq '.content' | base64 -d)"

  # 現在見ているコミットが該当バージョンのformulaでなければ一つ前のコミットを見る
  if ! echo "$formula_code" | grep -qE "^\s*url ['\"].*$package_version"; then
    continue
  fi

  # tapに任意のformulaを保存する
  echo "$formula_code" >"/opt/homebrew/Library/Taps/$user_name/homebrew-$formura_name/Formula/$package_name.rb"

  # ローカルのformulaをインストール
  brew install "$tap_name/$package_name"

  exit 0
done < <(gh api --paginate "repos/$repo_name/commits?path=$remote_formula_path" --jq '.[].sha')

echo "A commit sha of $repo_name is not found."
exit 1

使い方

uv 0.9.18をインストールしたいとします。
この場合、次のようにコマンドを実行します。

bash brew_install_specific_version.sh uv 0.9.18

実行すると、Homebrewによって {macのユーザー名}/uv@0.9.18/uv としてインストールされます。

アンインストール用シェルスクリプト

シェルスクリプト

brew_uninstall_specific_version.sh
#!/usr/bin/env bash
set -xe -o pipefail

package_name="$1"
package_version="$2"
user_name="$(whoami)"
formura_name="$package_name@$package_version"
tap_name="$user_name/$formura_name"
brew uninstall "$tap_name/$package_name"
brew untap "$tap_name"

使い方

前述のuv 0.9.18をアンインストールする場合、次のようにコマンドを実行します。

bash brew_uninstall_specific_version.sh uv 0.9.18

Discussion