MacのHomebrewのパッケージ管理ソフトの Brew-fileに Issueにリクエストが来てたこともあって 他のパッケージから依存によってインストールされたものでない 一番上のパッケージのみを残す様なオプションを加えてみました。
HOMEBREW_BREWFILE_LEAVES, –leaves,
今回加えたオプションは、brew file init
などした時に、
他のパッケージの依存関係によってインストールされたものはリストに載せない、
というものです。
現在通常のbrew file init
で作ったBrewfileには
自分でインストールした覚えの無いものも結構あるかと思いますが、
それらは大概他のパッケージが必要としてHomebrewが自動でインストールしたものです。
これらを除くことでBrewfileがすっきりし、 また、必要の無くなった依存パッケージを消せるようにしたい、というのが今回の目的。
オプションは環境変数で
export HOMEBREW_BREWFILE_LEAVES=1
と.bashrcなどで環境変数を設定しておくか、
$ brew file --leaves <cmd>
コマンドに--leaves
というオプションを与えることで有効になります。
最新版に入ってるのでbrew update && brew upgrade
して入る
brew-file
なら使えます。
試しに比べてみると良いと思いますが、試すには適当なディレクトリで、
$ brew file init -f ./all.txt
$ brew file --leaves init -f ./leaves.txt
の2つのコマンドでファイルを作って比べてみてください。
(レポジトリをセットするかどうか聞かれますがその場にテストファイルを作りたいだけなのでn
で。)
まあ、やってることはbrew list
とbrwe leaves
なんでその出力を直接比べてもいいんですが。
(ただし、brew leaves
の方はtapしたレポジトリのものだとtapの部分も含めて表示されます。)
自分でやってみると、通常brew list
で200個位パッケージが出てきますが、
オプションを入れると半分位に減りました。
実際に見ているもの
元々Brewfileに書き出していたのはbrew list
で出てくる全パッケージでした。
leaves
オプションをつけると、これに変わって
brew leaves
で出てくるパッケージを見ます。
brew leaves
は他のパッケージが何も依存してない様なパッケージです。
例えば、bash
はreadline
を必要としますが、
この場合、readline
はleaves
には載りません。
ちょっとした問題点
主にライブラリ的なものが落とされるわけですが、
これちょっと思い通りにならない所もあって、
例えばgo
なんかはまず単体で入れる人も多いと思いますが、
色々使おうとして入れるパッケージがgo
に依存してることがあります。
その場合、後から入れたものによってgo
がleaves
に載らなくなります。
これだとちょっとBrewfileとしても見た目が良くありません。
そのファイルを使ってインストールすること自体には問題ありません。
go
は依存されてるので自動でインストールされるので。
ただ、後からインストールしたパッケージを削除した時に問題が起こります。
leaves
を入れるにあたり、clean
の際、
リストにあるパッケージが依存しているパッケージも
残す様にはしています。
ただ、go
に依存したパッケージを削除してしまうと
Brewfileからその項目が消え、
そのままclean
してしまうとgo
が消えてしまいます。
clean
する前にinit
すれば今度はgo
が誰にも依存されてないので
Brewfileに載ることになりますが、
それだとそもそもclean
で何も消えない状態なので。
また、そのBrewfileを他に持って行ってもgo
がインストールされません。
この辺、一応解決策として、絶対に残したいパッケージがある場合、
export HOMEBREW_BREWFILE_TOP_PACKAGES=go,coreutils
とHOMEBREW_BREWFILE_TOP_PACKAGES
という値に,
区切りでパッケージを書いておくと
そのパッケージはleaves
オプションの時でも
他のパッケージから依存されてても必ずBrewfileに書き出すようにします。
ただ、こういうパッケージを直接自分で書くようなことをしたくない、というのが そもそものコンセプトだったので余り自分的にはどうかと思う感じですが、 一応出来るようにしておいた、ということで。
まとめ
以前から、依存関係によってインストールされるパッケージによって Brewfileが膨れ上げるし、自分で何を管理しているのかわからなくなるので、 パッケージの依存関係はなんとか上手く管理できたりしないかな、と思って tree上に表示させてみようかとか色々考えてましたが、 逆にそれらをとっぱらってトップのパッケージだけを表示、と言うのが 簡単に出来るし良いかな、と思って入れてみました。
見た目的にスリムにもなるし意味のあるBrewfileになる感じはあります。
ただ、上に書いたような意図せず必要なものも削除してしまったり Brewfileに上手くパッケージが載らない場合もあります。
取り敢えずテストも兼ねて自分の環境ではしばらく
export HOMEBREW_BREWFILE_LEAVES=1
な状態でやっていこうとは思ってます。