2014/08/04 追記: brew bundle は非推奨になりました下のほうに「辛み」について書いていますがそのあたりの問題です。シェルスクリプトで set -e すれば代わりになるでしょう。



ついさっき @deeeet さんが書いていた BrewfileでHomebrewパッケージを管理する の記事が twitter のタイムラインに流れて来たのを見つけたので、これは良いかも!と思って自分もやってみたメモ。

まずは @deeeet さんの記事をみたほうが良いのだけど、例えばこんなかんじの Brewfile というものを用意して、その Brewfile のあるディレクトリで

$ brew bundle

とすると Brewfile に記述しておいた homebrew パッケージをまとめてインストールできるというもの。

で、知らなかったのだけど、さらに homebrew-cask というものを使う事で、 homebrew 本体では管理されていないような dmg なアプリケーションのインストールもできるという便利情報ありがたい。

で、ちょっと調べてみた

1. brewdler ってあった気がするんだけど brew bundle ってデフォ?

brewdler のページに

Note: this is now a native feature in homebrew:

って書いてあった。デフォだった。すごい、よし使おう。

2. brew tap foo/bar 2回目がエラーになって失敗する

Brewfile に

tap phinze/homebrew-cask 

と書いておくと、brew bundle 2回目の実行で必ず

Error: Already Tapped!

と表示されて失敗し、処理が止まってしまう。どう回避するのが正しいのかよくわからないので、とりあえず

tap phinze/homebrew-cask || true

としたら誤摩化せたのでそうしてみた。#けど良いのかコレ‎(´・ω・`)

ちなみに、

install zsh

とかだと

Warning: zsh-5.0.4 already installed

のように Warning なので処理は続行される。brew tap も Error じゃなくて Warning にするべきなのでは??

(追記) Issue あげたら賛同してくれる人もいたのでプルリク送りました => Warning にする変更が master にはいりました :D


3. 使いたいアプリの cask がない場合はどうすれば?

phinze/homebrew-cask の Casks ディレクトリにないアプリをインストールしたい場合はどれすれば良いのだろう?と思って調べてみた。

ryurock さんが Qiita に書いてた みんなhomebrew-caskって知ってるか? の 記事にヒントが書いてあったのだけど、どうやら自分で homebrew フォーミュラのレポジトリを用意すれば良いっぽい。 ryurock さんの記事だと、homebrew-cask を fork していじろう、と書いてあったけど、自分専用の homebrew-mycask とかにしたほうが良いと思ったので、そうしてみた。

https://github.com/sonots/homebrew-mycask

Casks ディレクトリを作って他のを真似して試しに echofon.rb を書いてみた。こんなかんじ。

class Echofon < Cask
  url 'http://www.echofon.com/bin/Echofon_1.8.0.dmg'
  homepage 'http://www.echofon.com/twitter/mac/'
  version '1.8.0'
  sha1 'e02251fc05847df223295f364b5a004019d47f7b'
  link 'Echofon.app'
end

ちなみに sha1 は

openssl sha1 ファイル名

とかやれば取得できる。これで、

brew tap sonots/mycask
brew cask install echofon

でインストールできるようになったので、Brewfile に

tap sonots/mycask
cask install echofon

と書いて完成。

なお、homebrew フォーミュラのレポジトリ書いたことがなかったけれど homebrew-フォーミュラレポジトリ名 というレポジトリ名にして github に作っておくと、brew tap ユーザ名/フォーミュラレポジトリ名 で tap できるようになるっぽい。

(追記) 4. brew install foo で古いバージョンが入っている場合エラーになって失敗する

Brewfile に

install zsh

と書いていて、最新が 5.0.4 だけれどもすでに古いバージョンが入っているような場合

Error: zsh-5.0.0 already installed
To install this version, first `brew unlink zsh'

のように Error となり、処理が止まってしまう。最新 5.0.4 が入っている場合は、

Warning: zsh-5.0.4 already installed

のように Warning レベルなので問題ない。

またか。。。腐ってるな。。。と思ってプルリク を送ったけれども、下位互換性を変えたくないと言われてしまったので、今のところは

install zsh || true

のようにする感じです。うぅ辛い T T

ちなみに brew upgrade でなんとかならないかとも試したけれど、brew upgrade はインストール済みでないとエラーと出すのと、最新バージョンがすでに入っている時の挙動が brew install と違って Warning ではなく Error なので(こっちもか。。。)、結局こんなかんじになってあんまり意味がない。
install zsh || brew upgrade zsh || true
うぅ辛い T T

下位互換性も大事だけど、Brewfile サポートしたのに、こういう挙動になるのは仕様としてちょっとあんまりな気がするので、全体的に見直して欲しい。brew コマンドの挙動を変えるというよりは、Brewfile 側の処理を整えていくのが良いんだろうな。


以上、@sonots でした。