rcmdnk's blog

オワ婚

Brewfileはオワコン と言われて久しいわけですが、 これはHomebrew本体から 訳あってbundleコマンドが外されただけです。

デフォルトコマンドからはサポートが外されましたが、 bundleを引き継ぐ公式のレポジトリもありますし、 一方でより便利に使う方法とかは出てきています。

Brewdler

Brewdlerはbrew bundleの元になるもので(と思う)、 元々はandrew/brewdler というレポジトリにありました。 (今はこのリンクはHomebrew/homebrew-brewdler へリダイレクトされる様になっています。)

2013年の頃まではBrewdlerはRubyGemsでインストールするようになっていました。

Homebrewの拡張:brewdler, tap, cask

この時は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

を実行すればリストされたパッケージがインストールされます。 tapcaskも対応しています。

また、新しいbrewdleコマンドでは、Brewfile内でパッケージのオプションを指定したい場合、

brew 'vim', args: ['with-lua', 'HEAD']

こんな感じで,をパッケージ名後に付けた後にargs: [...]という形で オプションから先頭の--を除いた形で書くようになっています。

また、bundleコマンドの時にあったような、すでにインストールされてる パッケージに対してwarningが出るのを抑えるためにinstall vim|| true みたいな面倒な事はしなくて大丈夫です。 (ただし、brew brewdleを実行すると インストールされてるか否か問わず 全てのリストされてる パッケージに対してSucceed to install ...と出て結構だるい。。。)

新しいオプションとしてdumpcleanupというサブコマンドが追加されていて、

$ 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コマンドを見付けた時に、便利そうだけど単に ファイルにリストされたパッケージをインストールするだけのものだったので、 もっと色々便利なものを自分で作ってしまえ、と言って作ったものです。

最初ははbrewdlebundleの方で自動でファイルを作ってくれるdump機能がなかったので、 それが欲しいから作ったものです。

現在は、 BrewfileをGitHubで管理する機能も付いています。

$ brew install rcmdnk/file/brew-file

でインストール。

$ brew file install

等、brew fileコマンドが使えるようになります。

brew-file: MacのHomebrewでBrewfileを扱うbrewallを改名した

Brew-file: Manager for packages of Homebrew

brewdleの方にもdumpcleanupの機能が付いたみたいですが、 brew-fileでも勿論出来ます(dump/initclean)。

また、ファイルも、デフォルトは/usr/local/Library/Brewfileを使います。 (他のHomebrew関連の物もあるディレクトリ。)

これも-f <File>と指定したり、 HOMEBREW_BREWFILEという環境変数で場所を指定したりも出来ます。 なので、brewdleと違ってどこからでもbrew fileコマンドを打つことが可能です。

GitHubで管理できる様になるのも便利な所だと思ってます。

BrewallにGitHubでリストファイルを管理する機能を付けた

履歴も残るのでいつ何を入れたかも確認出来ますし、 新しい環境に行ってもすぐにそのまま使えます。

また、 wrapper関数 をかませることで、brew install...みたいに普通にインストールしただけで、 Brewfileを自動でアップデートする様なことも出来ます。

Homebrew-fileのwrapperをスクリプトから関数に変更

それから、最近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でのパッケージ管理+環境管理は

な感じがベスト。

Sponsored Links
Sponsored Links

« Macでdefaultsコマンドで設定出来るオプションを調べる Ankerのモバイルバッテリーを比較、購入 »

}