post Image
心がHomebrewで旧バージョンのパッケージを入れたがってるんだ

はじめに

iOSの開発でSwiftgenを使っているプロジェクトに入った時、周りのメンバーが最新のv4.2.0ではなく、旧バージョンのv4.1.0を使用していたため、ダウングレードしなければいけない状況でした。
旧バージョンをインストールしたことがある場合は brew switch swiftgen 4.1.0で終わりなのですが、無い場合はオワタ\(^O^)/となってしまいます。
そのときに何とかしてダウングレードできないものかとググりまくって見つけた方法をここに記します。

現状

macOS : Sierra v10.12.2
Homebrew : v1.1.11
Swiftgen : v4.2.0  ←こいつをダウングレードしたい

ダウングレードするぞい

1. Formulaまで移動

Homebrewのリポジトリのあるディレクトリまで移動します。

$ cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/

2. 全コミットの取得

Homebrewの全コミットをgit fetch --unshallowで取得します。

$ git fetch --unshallow
remote: Counting objects: 329054, done.
remote: Compressing objects: 100% (139309/139309), done.
remote: Total 329054 (delta 190611), reused 325373 (delta 186941), pack-reused 0
Receiving objects: 100% (329054/329054), 94.67 MiB | 720.00 KiB/s, done.
Resolving deltas: 100% (190611/190611), completed with 3555 local objects.
From https://github.com/Homebrew/homebrew-core
   cb79fc2..e5e1865  master     -> origin/master

3. コミットの確認

欲しいバージョンのコミットを確認します。

$ brew log swiftgen --oneline | grep 4.1.0
307341b swiftgen: update 4.1.0 bottle.
bed3a58 swiftgen 4.1.0

4. 使用するコミットまで戻す

リポジトリを古いバージョンの頃に戻します。v4.1.0 の場合は 307341b のコミットまで戻します。

$ git checkout 307341b swiftgen.rb

5. 現バージョンのアンインストール

旧バージョンを入れるときに新しいバージョンのパッケージが存在していると入らないので、一度アンインストールしましょう。

$ brew uninstall swiftgen

6. 旧バージョンをインストールする

ここが重要です。Homebrew v1.1.11ではインストール時にリポジトリの自動アップデートを勝手に行う仕様になっているため、ここまでの工程が元に戻ってしまい、最新のパッケージの方がインストールされて、(゚Д゚)ハァ? となってしまうのですが、先頭の HOMEBREW_NO_AUTO_UPDATE=1 を指定するとアップデートせずに現在のコミットでインストールできます。

$ HOMEBREW_NO_AUTO_UPDATE=1 brew install swiftgen
==> Downloading https://homebrew.bintray.com/bottles/swiftgen-4.1.0.sierra.bottle.
######################################################################## 100.0%
==> Pouring swiftgen-4.1.0.sierra.bottle.tar.gz
🍺  /usr/local/Cellar/swiftgen/4.1.0: 172 files, 21.4MB

7. バージョンの確認

バージョンを確認します。やったぜ。

$ swiftgen --version
SwiftGen v4.1.0

8. リポジトリの修復

Homebrewのリポジトリが古い状態になっているので元に戻します。

$ git reset HEAD
$ git checkout .

9. 最後に

git fetch --unshallowでfull cloneしたことで重くなるかもと不安な方は/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core まで移動してから、以下のコマンドを入力することでlogを減らせます。

$ git fetch --depth=1
$ git gc
$ git prune

参考にさせてもらった記事


『 Swift 』Article List