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_only
がtrue
になっているものもあります。
(上の場合はまだこのkeg_only
の値が入る前にインストールされたのでnull
になってますが。)
keg_only
がtrue
だとKegに対してリンクが貼られず、linked_keg
の値がnull
のままになります。
これらのパッケージにはbrew ln --force <package>
でリンクを貼ることも出来ますが、
しない限りはリンクは貼られません。
(コンパイルのために必要なものとかMacのデフォルトのものと被るものがあるものなどがこれにあたります。)
この様なパッケージはlinked_keg
を見てもインストールされたものがわからないため、
とりあえずinstalled
のリストの最初にあるものを取ってくるか、
もしくは$(brew --prefix)/opt
に各パッケージのKegへのリンクがあるので
ここをチェックするときちんと現状のバージョンを取る事ができます。
追記ここまで
また、installed
にused_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
して貰えると正しくオプションを出力できます。