Brewfileはオワコン
と言われて久しいわけですが、
これはHomebrew本体から
訳あってbundle
コマンドが外されただけです。
デフォルトコマンドからはサポートが外されましたが、
bundle
を引き継ぐ公式のレポジトリもありますし、
一方でより便利に使う方法とかは出てきています。
Brewdler
Brewdlerはbrew bundle
の元になるもので(と思う)、
元々はandrew/brewdler
というレポジトリにありました。
(今はこのリンクはHomebrew/homebrew-brewdler
へリダイレクトされる様になっています。)
2013年の頃まではBrewdlerはRubyGemsでインストールするようになっていました。
この時はbrewdle
というコマンド(brew brewdle
ではなく、brewdle
単体)でした。
これと同じ機能のコマンドがHomebrew本体に取り込まれ、
brew bundle
というコマンドで使える様になりました。
このコマンドはカレントディレクトリにあるBrewfileというファイルを探して、
中に書いてあるパッケージをインストールする、と言うもの。
RubyのBundler
のGemfileを用意してbundle install
する的な感じのもの。
ただ、基本的にはGemfile何かと違ってバージョン管理などをきちんとするわけでも無いので、 ちょっとしたシェルスクリプトで代替出来る様なものでした。
ですが、分かりやすくて簡単な事もあって、 かつ、 Homebrew Cask によってコマンドラインツールだけではなくてアプリケーションも管理できる様になったため、 特にその頃ちょっと盛り上がってたBOXEN 1 から移行する人が多かった感じです 2。
その後、Homebrewの中にある基本的な管理コマンド以外については メンテナンスしていくのが難しくなってきたので、 本来のHomebrew機能以外の物は一通り外されました。
Redact “brew services” or move to separate project · Issue #28657 · Homebrew/homebrew
一時期は
$ brew bundle
Warning: brew bundle is unsupported and will be replaced with another,
incompatible version at some point.
Please feel free volunteer to support it in a tap.
...
というwarningが出る状態で使えてましたが、今は完全にコマンドが外されていて 使えません。
ですが、実は上に書いたとおり、元の
andrew/brewdlerが
にHomebrew/homebrew-brewdler
移行されて、このレポジトリをタップするだけで、brew brewdle
というコマンドで、
brew bundle
と同じ様な事が出来る様になります。
$ brew tap Homebrew/brewdler
これでBrewfileのあるディレクトリで
$ brew brewdle
を実行すればリストされたパッケージがインストールされます。
tap
やcask
も対応しています。
また、新しいbrewdle
コマンドでは、Brewfile内でパッケージのオプションを指定したい場合、
brew 'vim', args: ['with-lua', 'HEAD']
こんな感じで,
をパッケージ名後に付けた後にargs: [...]
という形で
オプションから先頭の--
を除いた形で書くようになっています。
また、bundle
コマンドの時にあったような、すでにインストールされてる
パッケージに対してwarningが出るのを抑えるためにinstall vim|| true
みたいな面倒な事はしなくて大丈夫です。
(ただし、brew brewdle
を実行すると
インストールされてるか否か問わず
全てのリストされてる
パッケージに対してSucceed to install ...
と出て結構だるい。。。)
新しいオプションとしてdump
、cleanup
というサブコマンドが追加されていて、
$ brew brewdle dump
で現在のディレクトリにBrewfileを作成、 また、
$ brew brewdle cleanup
でリストにないパッケージを削除します。
Inputファイルは
File.read(Dir['{*,.*}{B,b}rewfile'].first.to_s)
という形で探されてるので、.brewfile
とかでも読み込まれる模様。
ただし、dump
の時には必ずBrewfileになります。
また、どうしたってbundle
というコマンドが使いたい、と言う場合には
$ brew tap homebrew/boneyard
をタップすると、以前のbundle
コマンドを使えるようになります。
(ただし名前通り使われなくなったものが葬られてる場所なので
今後のアップデートとかはまず無いものだと思います。)
Homebrew/homebrew-boneyard: https://github.com/Homebrew/homebrew-boneyard/
Brew-file
最初のbundle
コマンドを見付けた時に、便利そうだけど単に
ファイルにリストされたパッケージをインストールするだけのものだったので、
もっと色々便利なものを自分で作ってしまえ、と言って作ったものです。
最初ははbrewdle
やbundle
の方で自動でファイルを作ってくれるdump
機能がなかったので、
それが欲しいから作ったものです。
現在は、 BrewfileをGitHubで管理する機能も付いています。
$ brew install rcmdnk/file/brew-file
でインストール。
$ brew file install
等、brew file
コマンドが使えるようになります。
brewdle
の方にもdump
やcleanup
の機能が付いたみたいですが、
brew-fileでも勿論出来ます(dump
/init
やclean
)。
また、ファイルも、デフォルトは/usr/local/Library/Brewfileを使います。 (他のHomebrew関連の物もあるディレクトリ。)
これも-f <File>
と指定したり、
HOMEBREW_BREWFILE
という環境変数で場所を指定したりも出来ます。
なので、brewdle
と違ってどこからでもbrew file
コマンドを打つことが可能です。
GitHubで管理できる様になるのも便利な所だと思ってます。
履歴も残るのでいつ何を入れたかも確認出来ますし、 新しい環境に行ってもすぐにそのまま使えます。
また、
wrapper関数
をかませることで、brew install...
みたいに普通にインストールしただけで、
Brewfileを自動でアップデートする様なことも出来ます。
それから、最近brewdle
がダンプ機能を持ったことを知って、
しかも特殊な書き方をしてるので、
それに対応するようにbrew-file
もアップデートしました。
読み込むときは
brew install vim --HEAD --with-lua # exactly same as command
brew vim --HEAD --with-lua # brew-file default
brew 'vim', args: ['with-lua', 'HEAD'] # brewdle format
この様に、通常インストールするコマンドのままの形や、
install
等を除いた形(もしくはbrew
を除いてinstall
だけも可)、
また、args
を使ったbrewdle
形式でも読み込める様になっています。
brew file init
またはbrew file dump
等でファイルを初期化出来ますが、
このアウトプットも通常は
brew vim --HEAD --with-lua
と言った形ですが-F brewdle
とフォーマットを指定すると
brew 'vim', args: ['with-lua', 'HEAD']
と出力出来ます。
基本的に、MacでHomebrewを使うのは、取り敢えず簡単に物をインストールする、と言う ためのもので、 それを記録しておいて他の環境でも出来たら便利だな、というものだと思います。
それだと常に最新の設定ファイルを自分で書いて、 環境を構築する、といったRubyのGemfile的な使い方とはちょっと違います。
なので、まず、ファイルを自動的に作成するようなダンプ機能が必要だし、 出来れば特にユーザーが気を使わずとも勝手にアップデートされててほしいものです。
なので、上の様なwrapper関数とか、update
というコマンドで
ファイルのアップデートと、GitHubとの同期も一気に出来る様にもなってたりします。
これを使って、cron jobなんかで
0 12 * * * brew file update
とかしておけば、毎日お昼の12時に自動でアップデートしてくれます。
また、ファイルの場所を指定できるので、GitHubで管理する代わりに、 Dropbox内にファイルの場所を指定したりしても便利かと思います。
brew-file
はそもそもBrewfileとかを自分で書くのが面倒なので
作った、と言うのが
その他のツール
最近、bundle
が使えなくなった(からBrewfileがオワコンだ!)
と言って、他の方法として
Ansible
というツールを使った構成についての言及がちょこちょこあります。
AnsibleにはHomebrewのモジュールが用意されていて、それを使って Homebrewで扱うパッケージも管理できる様に出来るようです3。
Ansible自体が管理ツールなので、
Homebrewで管理出来ないものがある場合には
便利な面もあるかもしれませんが、
HomebrewのFormulaは結構簡単に作れるので4
自分で作って取り敢えず自分のGitHubのレポジトリに入れてみたり、
公式にPull Requestしてみても結構すぐにAcceptしてくれます。
(ただし、きちんと
Formula-Cookbook: https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/Formula-Cookbook.md#formula-cookbook
を読んで正しいフォーマットにしておくこと。)
なので、Homebrewで管理できないもの、と言うのは余りありません。
(Appstoreからのインストールくらい。ただしこれはAnsibleでも出来ない(と思う))
ファイル自体は勿論自分で書かないといけないので、 最初慣れてないと結構面倒です。
また、cider と呼ばれるツールも結構有名です。
こちらはMacのパッケージインストールツールですが、
Homebrew関連のパッケージのインストールに加え、
defaults
コマンドで設定できる様なものに対する設定も出来る様になっています。
こちらも自分でファイルを用意する必要があります。
まとめ
“Brewfileはオワコン”という話がありますが、
それは諸事情でHomebrew本体からbundle
コマンドが外されただけで、
元となった(と思う)brewdle
コマンドは
Homebrew
ユーザー下に取り込まれて管理されていますし、
もっと便利な(と勝手に思う)
brew-fileもあります。
brew-file
を使えばファイルも勝手に作ってくれて
さらにGitHub(もしくは適当なGitサーバー)でファイルを管理することも簡単です。
自分で書くにしても普通にコマンドを書けば良いだけ。
その他、で書いたciderなんかは環境設定なんかも書いて置けるのでちょっと便利そうですが、 これについては mackupという更に便利なツールがあって、 これを使うとDropboxとかで設定ファイルを簡単に同期できる様になります。
やってることは、必要なplistファイル等が登録されていて、
mackup backup
を実行すると設定ファイルをDropbox内にコピーし、
元々ファイルが有った場所にはそのファイルへのリンクを置き換えます。
これによって動的に設定ファイルを同期することが出来ます。
Macでdefaultsコマンドで設定出来るオプションを調べる
の所でdefaults
コマンド関連の処理をちょっと試みましたが、
余り上手くないので取り敢えず直接ファイルを同期してしまう
mackupの方が簡単で上手く行きます。
Ansibleや ciderや他にも色々管理ツールがあったりしますが、それら基本、最初に自分で設定ファイルを全部書かなくてはいけないし、 アップデートがあるたびに自分で設定ファイルを変更しなくてはいけないので、 自分だけで使うマシンの設定のバックアップ的な使い方としては面倒すぎます。
Homebrewを使ってインストールが簡単に出来る、と言う利点をそのまま使って、 インストールしたらそのまま設定ファイルがアップデートされれば一番簡単。
ということで、Macでのパッケージ管理+環境管理は
- Homebrew + Homebrew Cask + brew-file + mackup
な感じがベスト。
-
homebrew - Package manager for Homebrew — Ansible Documentation: http://docs.ansible.com/homebrew_module.html- Ansibleでhomebrewを管理する - 理系学生日記
- Mac の開発環境構築を自動化する (2015 年初旬編) - t-wadaのブログ ↩
-
- Homebrew用のパッケージの簡単な作り方
homebrew/Formula-Cookbook.md at master · Homebrew/homebrew: https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/Formula-Cookbook.md#formula-cookbook↩