MacのパッケージマネージャーのHomebrewのバージョン1.0.0がリリースされました。 1.0.0ということで正式リリース的な感じですが、 このバージョンアップに伴いレポジトリインストール先の変更等 幾つかの変更点があります。
その変更によってBrew-fileの方でちょっと問題があったりもしたので そのあたりを直しました。
Homebrew 1.0.0
1週間ほど前にHomebrew 1.0.0がリリースされました。
まだこのポストだけなのでコレを機に始めるのかどうか分かりませんが、 このページはHomebrew blogの最初のポストにもなっています。
これに伴うアップデートなどは上のページにまとめられています。 (以前のリリースで既に入っているものもいくつかあります。)
以下、上のページにある中でいくつか気になるものについて。
Homebrewのインストール先の変更
特に大きな変更は、これまでHomebrew本体を/usr/localにインストールしていたのに対し、 1.0.0からは/usr/local/Homebrewともう一つディレクトリを掘ってインストールするようになったことです。
これまでは/usr/local全部をHomebrewのものにしてしまっていましたが、 この変更によって/usr/localはより自由なものになります。
この変更はユーザーは特に気にしなくてもbrew update
することによって
自動的に変更されます。
アップデート後、/usr/local/Homebrewと言うディレクトリが出来ていて、 その中にbin/brew等があることが確認出来るはずです。 /usr/local/bin/brewは/usr/local/Homebrew/bin/brewへのシンボリックリンクになっています。
/usr/localについてはEl Capitanから導入されたSIPの保護からも外れているので ユーザーが使える領域ですが、 初期状態だとこのディレクトリ自体が無くて、/usrは保護下のためそこにディレクトリを作成できず、 Homebrewも導入できません。 この問題は依然残っていて、最初にHomebrewをインストールする際には このSIPを一時的に無効化する必要があります。
brew
コマンドには--repository
と言うHomebrewのレポジトリのインストール先を調べるオプションと
--prefix
と言うHomebrewで導入されたコマンドなどを入れる場所の親ディレクトリを
調べるオプションがありますが、
これまではデフォルトでは何方も/usr/localを返していました。
当然これが1.0.0からは--repository
が
$ brew --repository
/usr/local/Homebrew
を返す様になります。
Homebrew本体とFormulaの入ったレポジトリの分離
これは少し前に導入されていたものですが、 Homebrewの本体とFormulaの入ったレポジトリは分離され、それぞれ別に管理される様になっています。
Formulaは非常に頻繁にPull Request、アップデートがあるので本体のメンテと分離出来る様に、と。
/usr/local/Homebrewにインストールされるのが Homebrew/brew で、Formulaの入ってる Homebrew/homebrew-core は /usr/local/Homebrew/Library/Taps/homebrew/homebrew-coreに tapされる事によって導入されます。 (tapはこのレポジトリに関しては自動的に行われます。)
Homebrew-Caskとの統合
Homebrewでアプリも管理できる様にしてくれる
brew-cask
コマンドですが、
これもちょっと前にあった変更があり、
Homebrew本体に統合されました。
Caskファイルの方は以前の
caskroom/homebrew-cask
でメンテナンスが続けられていて、
最初にcask
コマンドを呼んだ時にこのレポジトリは自動的にtapされます。
bundle、serviceサブコマンドを公式にサポート
これはだいぶ前からあって、恐らく公式と言うのは
関連するレポジトリがHomebrewユーザーのところにある、ということだと思うのですが、
パッケージ管理のbundle
コマンド、サービスをHomebrewで管理できる様にするservice
コマンド共に
レポジトリをタップすることでサブコマンドが使える様になります。
$ brew tap homebrew/bundle
$ brew tap homebrew/service
Auto update
これはきちんと把握してなかったんですが、
数ヶ月前からbrew install
、brew tap
、及びbrew upgrade
コマンドを行う際、
自動的にbrew update
が行われる様になっていた様です。
デフォルトでは1分以内に再度コマンドを使った際にはupdate
は行わない、と言う設定になっていますが、
これは
export HOMEBREW_AUTO_UPDATE_SECS=600
の様にHOMEBREW_AUTO_UPDATE_SECS
の値に秒単位で間隔を指定することで変更できます。
また、自動更新を無効にするには
export HOMEBREW_NO_AUTO_UPDATE=1
と設定すると無効に出来ます。
デフォルトで有効になってるのは
Homebrewで問題が起こった、とユーザーが言う場合にその殆どが最新版にしていないだけで
brew update
をすることで解決するものだから、ということらしいのですが、
把握してないうちに勝手にアップデートされることやbrew update
は割と時間がかかることもあり、
嫌がる人も居て反対してる人も結構居るみたいです。
上のポストは最近、もう一つのパッケージ管理ソフトのMacPortがやっとGitHubで ソース管理を始めた、という事に関するHacker Newsのページですが、 この中でそんな話があって、 ちょっと前にあったAnalyticsで情報を集めるのをデフォルトで行う様になったのと同様な 嫌なアップデートだと言う話もあります。
まあ、Analyticsとは違って、こういった機能は便利であっても、宣伝しても設定しないと使えないものだと なんだかんだ使えない人が大多数で、そういった人の殆どは勝手に更新されてくれてたほうが嬉しい状況だと思うので 大多数の人にとっては良くなるアップデートであるとは思いますが。
もし自分のタイミングでアップデートしたい、というのであれば 上のオプションを.bashrc等に書いておいてください。
HEADバージョンで入れたパッケージのアップデート
[RFC] Allow HEAD-upgrades by vladshablinsky · Pull Request #584 · Homebrew/brew
Homebrewでは--HEAD
オプションを付けると
そのパッケージのHEADバージョンをインストールすることが出来ます。
(Formulaで定義されている必要がありますが、GitHubで管理されてるものなどだと
masterレポジトリのものをコンパイルして入れたりします。)
これが、今までは$(brew –cellar)ディレクトリの中で HEADと言う名前のディレクトリにインストールされていました。
通常、バージョンが付いてるものだとそのバージョンの名前でインストールされ、 別バージョンの物も同時に持っておくことが可能でした。
これが、HEADにもバージョン番号が自動で付くようになり、 Gitのレポジトリとかだとそのコミット番号等が付いたHEAD-xxxxxxxと言った名前のディレクトリになります。
これによってHEADとして入れたものもアップグレード出来る様になる、とのことです。
brew upgrade
には--fetch-HEAD
と言うオプションがあり、
このオプションを付けるとHEAD
としてインストールしたパッケージもアップグレードしてくれます。
この辺、上のPull requestsを見てもイマイチきちんと理解できてないんですが、 最初、このオプションを付けなくても自動でアップグレードするようになる、 ということだと思ってたんですが、 やってみるとどうもそんなことは無さそうでした。
取り敢えずは--fetch-HEAD
オプションを使うと--HEAD
でインストールしたものもアップグレードされるので、
brew upgrade
等をスクリプトなどでやってる場合にはこのオプションを加えておくと良いと思います。
Brew-file 4.0.X
Homebrewの方で色々変更があったのでそれに伴って Brew-fileの方も色々とアップデートしました。
まず、既にインストールされたCaskのバージョンを調べたりするのに、 これに今まで$(brew –repository)/Library/Caskroomを探していました。
今まではbrew --repository
とbrew --prefix
が同じだったので良かったのですが、
brew --repository
の方はもう一段階下のHomebrewディレクトリに下がり、
Caskroomはbrew --prefix
(/usr/local)の下にあります。
ただ、このレポジトリのパスを使ってる物も他にあったので別途prefixのパスも使える様に変更。
また、Auto update機構が入ったので、
brew tap
でタップしたレポジトリを調べようとするとき、Auto updateが走って余計な出力を含んでしまうようになったので
その辺の処理を追加。
Auto updateはまあ便利だと思うのですが、
これみたいに出力に余計なのが追加されてしまうのはちょっと良くないです。
install
とupgrade
、及びtap
でパッケージの引数があるとき、と言った条件が必要かな、と。
tap
コマンドが引数なしだとリスト表示、と言うまとめたコマンドになってるのが根源ではありますが。
brew bundle
の方が公式にサポート、ということですが、
Brew-fileとしては単にパッケージリストを出力したりまとめてインストールするだけでなく
GitHubなどでファイルを管理したりすることが目的でもあるので
(brew bundle
で出来ることは最低限出来る様になってるはずです。何か無かったら教えてもらえると嬉しい。)
bundle
とコンフリクトするからということでFormulaを公式に入れるのも辞めて、
できれば機能だけbundleの方へ移植してそちらへ移そうかな、という気はあるのですが、
こちらはPythonなのでbundleのRubyコードに直すのが面倒で取り敢えず引き続き別途作っていきます。