Edited at

Homebrewをupdateしようとしたらエラーになりました 2014-10-23

More than 3 years have passed since last update.

先日、Mac OSX Yosemiteがリリースされました。個人的にはフラットデザイン以外には大きな変更点はありませんでしたが、それでもやはり新しいものは魅力的。ということで、敬虔かつ模範的な方々が早速アップデートにトライし、そのお蔭で非常にたくさんのノウハウが蓄積されてきています。11月までは絶対にアップデートしないと心に誓った私としてはその戦列に加わることができず大変心苦しいのですが、せめて現状でもできることをしようということで、Homebrewのアップデートでもしようと試みた次第です。

なぜHomebrewのアップデートが必要かはこちらを参照。「時間めっちゃかかるけど大丈夫」という情報があるなかで、旧版のままトライした方は大変つらい思いをしたみたいです。


どうやら、Yosemiteにする前にhomebrewを最新版にしておけば何事も問題なかったようです。嘘つきとかいってごめんなさい。

Yosemiteインストール前にbrewを最新にする。これが一番の決定策です。

定期的なアップデートって本当に大事なのね!まあ、この記事はそれを怠って問題にぶち当たった人のための記事なのだけど


とはいえ、アップデート漏れがあるのは人として仕方のないことですし、やっぱりそういうのは運が悪かったということで、どうせ万全の体制で望んでも数々のトラブルに見舞われるわけですから、散っていった多くの先人たちに手を合わせつつあとからゆっくり追いかけていくというのがわれわれのような模範的でないMacユーザーができるせめてもの罪滅ぼしなのであります。


Homebrewのアップデートをする

ということで(何の記事だかわからなくなってしまいましたが)、Yosemiteアップグレードの準備工事をするために brew update と打ち込んだわけです。

ちなみに私の環境はOSX 10.9.5です。

$ brew update

error: Your local changes to the following files would be overwritten by merge:
Library/Formula/gradle.rb
Please, commit your changes or stash them before you can merge.
Aborting
Error: Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master

なるほどGitか。それにしても何かしたっけ?と思って検索するとこんな記事が。言われてみれば確かにGradleの設定を変えた記憶ありますね。あれは確かAndroid Studioのために変えたんだったかな。


$ cd $(brew --prefix)

$ git log

元記事は git reset --hard origin/master してるんですが、--hardはちょっと気が引けたので、 git stash して、どうするかは後で変更内容をみてから考えることにしました。

$ git stash

Saved working directory and index state WIP on master: 29c7441 Set the remote config manually
HEAD is now at 29c7441 Set the remote config manually

$ brew update
Updated Homebrew from 29c74418 to 62ffeaac.

$ git stash pop
Auto-merging Library/Formula/gradle.rb
CONFLICT (content): Merge conflict in Library/Formula/gradle.rb


brew versionsはもう使えない

そしてコンフリクトの状況を確認する。そういえばAndroidStudioのGradleは1系じゃないと怒られるんだよなぁ…と思い出した。インストールしたときに触ったような、触ってないような。

Screen Shot 2014-10-23 at 22.04.22.png

かつてHomebrewで複数バージョンのformulaをインストールする方法は brew versions だったのですが、いつの間にか使えなくなっていました。どうやらhomebrew-versionsという公式リポジトリが別途用意された模様です。


公式のリポジトリですが手動で加える必要があります。

あるいはリポジトリを足さずに個別にバージョン指定して入れることもできます。


ということで、gradle.rbのコンフリクトを解消します。upstreamを優先して、1系のformulaは改めて入れなおすことに。



$ vi Library/Formula/gradle.rb


旧バージョンのGradle formulaを再インストール


パッケージがコンフリクトを起こすことがあるのでHomebrew-versionsを使い始める前にversionsコマンドを利用して入れたパッケージはアンインストールして入れ直すほうが無難です。


そして、勧めに応じて念のため以前のバージョンは削除します。入れたいformulaはGradleひとつだけなので、リポジトリは加えずにインストールし、シンボリックリンクを1.12に貼り替えます。

brew cleanup gradle

Removing: /usr/local/Cellar/gradle/1.12...

$ brew search gradle
gradle gradle110 gradle112 gradle16 gradle18

$ brew install homebrew/versions/gradle112
==> Installing gradle112 from homebrew/homebrew-versions
==> Downloading https://services.gradle.org/distributions/gradle-1.12-bin.zip

Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink bin/gradle
Target /usr/local/bin/gradle
is a symlink belonging to gradle. You can unlink it:
brew unlink gradle

To force the link and overwrite all conflicting files:
brew link --overwrite gradle112

To list all files that would be deleted:
brew link --overwrite --dry-run gradle112

Possible conflicting files are:
/usr/local/bin/gradle -> /usr/local/Cellar/gradle/2.1/bin/gradle
==> Summary
? /usr/local/Cellar/gradle112/1.12: 155 files, 44M, built in 2.0 minutes

$ brew unlink gradle
Unlinking /usr/local/Cellar/gradle/2.1... 1 symlinks removed

$ brew link --overwrite gradle112
Linking /usr/local/Cellar/gradle112/1.12... 1 symlinks created

インストール部分はこれでもOK。

$ brew tap homebrew/versions

$ brew install gradle112

これにてアップデート終了。おつかれさまでした。

$ brew --version

0.9.5

$ gradle --version
------------------------------------------------------------
Gradle 1.12
------------------------------------------------------------


余談

brew --prefix これでhomebrewのルートフォルダを取得できるのは知らなかったし、 $( ) も知らなかったなあ。