🍺
Homebrewで任意のバージョンのパッケージをインストールするシェルスクリプト
上記の記事に書かれている手順を行うことで、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