rcmdnk's blog

20160929_homebrew_200_200

MacのパッケージマネージャーのHomebrewのバージョン1.0.0がリリースされました。 1.0.0ということで正式リリース的な感じですが、 このバージョンアップに伴いレポジトリインストール先の変更等 幾つかの変更点があります。

その変更によってBrew-fileの方でちょっと問題があったりもしたので そのあたりを直しました。

Sponsored Links

Homebrew 1.0.0

1週間ほど前にHomebrew 1.0.0がリリースされました。

1.0.0 — Homebrew

まだこのポストだけなのでコレを機に始めるのかどうか分かりませんが、 このページは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 core code moved to Homebrew by AnastasiaSulyagina · Pull Request #23852 · caskroom/homebrew-cask

brew/Library/Homebrew/cask

Caskファイルの方は以前の caskroom/homebrew-cask でメンテナンスが続けられていて、 最初にcaskコマンドを呼んだ時にこのレポジトリは自動的にtapされます。

bundle、serviceサブコマンドを公式にサポート

これはだいぶ前からあって、恐らく公式と言うのは 関連するレポジトリがHomebrewユーザーのところにある、ということだと思うのですが、 パッケージ管理のbundleコマンド、サービスをHomebrewで管理できる様にするserviceコマンド共に レポジトリをタップすることでサブコマンドが使える様になります。

$ brew tap homebrew/bundle
$ brew tap homebrew/service

Auto update

これはきちんと把握してなかったんですが、 数ヶ月前からbrew installbrew tap、及びbrew upgradeコマンドを行う際、 自動的にbrew updateが行われる様になっていた様です。

Auto-update when running brew install/upgrade.

デフォルトでは1分以内に再度コマンドを使った際にはupdateは行わない、と言う設定になっていますが、 これは

export HOMEBREW_AUTO_UPDATE_SECS=600

の様にHOMEBREW_AUTO_UPDATE_SECSの値に秒単位で間隔を指定することで変更できます。 また、自動更新を無効にするには

export HOMEBREW_NO_AUTO_UPDATE=1

と設定すると無効に出来ます。

デフォルトで有効になってるのは Homebrewで問題が起こった、とユーザーが言う場合にその殆どが最新版にしていないだけで brew updateをすることで解決するものだから、ということらしいのですが、 把握してないうちに勝手にアップデートされることやbrew updateは割と時間がかかることもあり、 嫌がる人も居て反対してる人も結構居るみたいです。

Goodbye Mac OS Forge, hello GitHub Hacker News

上のポストは最近、もう一つのパッケージ管理ソフトの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 --repositorybrew --prefixが同じだったので良かったのですが、 brew --repositoryの方はもう一段階下のHomebrewディレクトリに下がり、 Caskroombrew --prefix(/usr/local)の下にあります。 ただ、このレポジトリのパスを使ってる物も他にあったので別途prefixのパスも使える様に変更。

また、Auto update機構が入ったので、 brew tapでタップしたレポジトリを調べようとするとき、Auto updateが走って余計な出力を含んでしまうようになったので その辺の処理を追加。

Auto updateはまあ便利だと思うのですが、 これみたいに出力に余計なのが追加されてしまうのはちょっと良くないです。 installupgrade、及びtapでパッケージの引数があるとき、と言った条件が必要かな、と。 tapコマンドが引数なしだとリスト表示、と言うまとめたコマンドになってるのが根源ではありますが。

brew bundleの方が公式にサポート、ということですが、 Brew-fileとしては単にパッケージリストを出力したりまとめてインストールするだけでなく GitHubなどでファイルを管理したりすることが目的でもあるので (brew bundleで出来ることは最低限出来る様になってるはずです。何か無かったら教えてもらえると嬉しい。)

bundleとコンフリクトするからということでFormulaを公式に入れるのも辞めて、 できれば機能だけbundleの方へ移植してそちらへ移そうかな、という気はあるのですが、 こちらはPythonなのでbundleのRubyコードに直すのが面倒で取り敢えず引き続き別途作っていきます。

Sponsored Links
Sponsored Links

« Firefox 49でVimperatorのSmart Completionが効かない問題への対処法 Travis CIでのMacのOS環境を変更する設定 »