rcmdnk's blog
Last update

JSON at Work: Practical Data Integration for the Web

Brew-fileで パッケージ情報を取る時にbrew infoのテキスト出力を直接自分で解析する様な事を していたのですが、ちょっと表示が変わって上手く取れなくなっていました。

変更しようと思って調べてる時にちょっとHomebrewのマニュアルを 見たらbrew info --json=v1というオプションがあることに気づいて 今更ながらそれを導入した話。

Brew-fileでのこれまでのパッケージオプション取得方法

これまで、Brew-fileではbrew info vim等の出力を見て、

Built from source with: --with-lua

となっている行からオプションを取ってきていました。 ここでBuild from source with:という文字列を探してその後の部分をオプションとして取る、的な。

これが、最近Homebrewではインストールした時間も記憶、表示する用になり、

Built from source on 2016-05-07 at 03:08:49 with: --with-lua

こんな表示になりました。 なので以前のままではオプションの取得に失敗します。

brew info –json=v1でJSONでパッケージ情報を取得

man brewを見ていたら、

info --json=version (--all|--installed|formulae)
       Print a JSON representation  of  formulae.  Currently  the  only
       accepted value for version is v1.

というのを今更ながら見つけました。

Querying Brew: https://github.com/Homebrew/brew/blob/master/share/doc/homebrew/Querying-Brew.md

このオプション自体は2012年頃には入っている物で、 ドキュメントは後から入れられてますがそれでも随分前に入っているので 何故Brew-fileみたいなのを作ろうと思った時にちゃんと調べなかったのかと。。。

それは良いとして、--jsonというオプションがinfoサブコマンドに対して使える、ということですが、 --jsonに与えるオプションは今のところv1だけです。

$ brew info --json=v1 vim
[{"name":"vim","full_name":"vim","desc":"Vi \"workalike\" with many additional features","homepage":"http://www.vim.org/","oldname":null,"aliases":[],"versions":{"stable":"7.4.1817","bottle":false,"devel":null,"head":"HEAD"},"revision":0,"installed":[{"version":"7.4.1817","used_options":["--with-lua"],"built_as_bottle":false,"poured_from_bottle":false}],"linked_keg":"7.4.1817","pinned":false,"outdated":false,"keg_only":null,"dependencies":["lua","luajit"],"recommended_dependencies":[],"optional_dependencies":["lua","luajit"],"conflicts_with":["ex-vi"],"caveats":null,"requirements":[{"name":"python","default_formula":"python","cask":"python","download":null},{"name":"python3","default_formula":"python3","cask":"python3","download":null}],"options":[{"option":"--override-system-vi","description":"Override system vi"},{"option":"--disable-nls","description":"Build vim without National Language Support (translated messages, keymaps)"},{"option":"--with-client-server","description":"Enable client/server mode"},{"option":"--with-python3","description":"Build vim with python3 instead of python[2] support"},{"option":"--with-lua","description":"Build vim with lua support"},{"option":"--with-mzscheme","description":"Build vim with mzscheme support"},{"option":"--with-tcl","description":"Build vim with tcl support"},{"option":"--without-perl","description":"Build vim without perl support"},{"option":"--without-python","description":"Build vim without python support"},{"option":"--without-ruby","description":"Build vim without ruby support"},{"option":"--with-luajit","description":"Build with luajit support"}],"bottle":{}}]

な感じの出力が得られます。

JSONなんでこれで何でも出来るわけですが、 Brew-fileとしてほしいものは

"versions":{"stable":"7.4.1817","bottle":false,"devel":null,"head":"HEAD"},
"installed":[{"version":"7.4.1795","used_options":["--with-lua"],"built_as_bottle":false,"poured_from_bottle":false}],
"linked_keg":"7.4.1817"

辺り。

古いバージョンの物が残っている場合、installedは複数出てくるので linked_kegでチェックする必要があります。

追記: 2017/07/31

パッケージによってはKegに対してリンクを貼らないkeg_onlytrueになっているものもあります。 (上の場合はまだこのkeg_onlyの値が入る前にインストールされたのでnullになってますが。)

keg_onlytrueだとKegに対してリンクが貼られず、linked_kegの値がnullのままになります。 これらのパッケージにはbrew ln --force <package>でリンクを貼ることも出来ますが、 しない限りはリンクは貼られません。 (コンパイルのために必要なものとかMacのデフォルトのものと被るものがあるものなどがこれにあたります。)

この様なパッケージはlinked_kegを見てもインストールされたものがわからないため、 とりあえずinstalledのリストの最初にあるものを取ってくるか、 もしくは$(brew --prefix)/optに各パッケージのKegへのリンクがあるので ここをチェックするときちんと現状のバージョンを取る事ができます。

追記ここまで

また、installedused_optionsの欄があってオプションが取得できますが、 --HEAD--develはここには入らないので別途versionで確認する必要があります。

さらには

$ brew info --json=v1 --installed

とすると、インストールされたパッケージ全ての情報がリストが取得出来るので brew file initの所でもこれ使う様に変更したら高速化出来るな、と思っている所。

追記: 2016/05/09

$ brew info --json=v1 --installed

を使って最初にオプション毎リストを作ってしまうようにアップデートしてみました。

brew file initが相当高速化されました。 (200パッケージ位入っている状態で40秒程かかっていたものが3秒ほどに!)

追記ここまで

まとめ

Querying Brew にもありますが、 JSONで情報を取得できる事で色々パッケージの情報を見ながら 操作をすることが簡単に出来る様になってます。

Brew-fileに関してもアップデートをしましたが、 これまで暫くの間オプションを落とした状態で出力されていたので ちょっと注意してください。

Brew-fileをアップデートしてbrew file initして貰えると正しくオプションを出力できます。

Sponsored Links
Sponsored Links

« Androidでストレージアクセスに問題がある場合、Battery Mixが問題の場合がある Pythonでのrstripを間違って使っていた »

}