Brewfileでの管理
Homebrewでインストールしたりするパッケージに関しては Brew-fileを使ってBrewfileでリストを管理しています。
これのインストールは
$ brew install rcmdnk/file/brew-file
で出来ます。
コマンドはbrew file <subcommand>
になります。
一方Homebrewには一応公式的なbundle
というコマンドもあります。
どちらもHomebrew関連(brew or cask, + Apple Storeアプリをmasで管理)で いれたパッケージ/アプリをBrewfileに書き出したり、 Brewfileをもとにまとめてインストールしたりするコマンドです。
Brew-fileでは加えて
brew install
やbrew uninstall
時に自動的にBrewfileをアップデートする。- GitHubのレポジトリなどを使って管理が出来る。他のマシンとの共用がやりやすい(dotfiles的な)。
- 複数のファイル形式がある(bundleの出力も読み込める)。
単にファイルにリストを書き出してそれをもとにインストールするだけなら、
brew list
とかと簡単なシェルスクリプトでも出来てしまうことですが、
この辺の自動で管理することがしたくてBrew-fileを使っています。
brewパッケージの整理
これが一番やっかいですが、Homebrewでは 他のパッケージに依存しているものをインストールする際には 依存先のパッケージが入っていなければ自動的にインストールされます。
元のアンインストールする際にはそれらのパッケージはアンインストールされないので 長いこと使ってると使わないのに入ってるパッケージとかも結構あるはずです。
インストールした時に直接入れたのか何かの依存パッケージとして入ったのかは
去年、Homebrew導入された
installed_on_request
/installed_as_dependency
という情報で見ることが出来ます。
ただ、この指標が導入される前にインストールされたパッケージに関しては
これらの値がtrue
とかfalse
でなくてnull
になってるので
分からない場合もあります。
また、たとえばpython
とかは普通に入れたいものだったりするかもしれませんが、
自分で入れるよりも先に他のパッケージの依存として入っていると
installed_on_request
がfalse
になってることもあります。
なので、使うとしたら見覚えのないパッケージを調べてinstalled_as_dependency
がtrue
かどうか見る、と言った感じでしょうか。
一方で、現在インストールされてるパッケージの依存関係などは
$ brew deps --tree --installed
...
vim
├── perl
├── ruby
│ ├── libyaml
│ ├── openssl
│ └── readline
└── python
├── gdbm
├── openssl
├── readline
├── sqlite
│ └── readline
└── xz
...
みたいな感じで確認することが出来ます。
さらに、どのパッケージからも依存されてないパッケージは
$ brew leaves
というコマンドでリストを得る事ができます。
ここで出て来るリストで見慣れない物があったら
$ brew info --json=v1 vim
[{"name":"vim","full_name":"vim","desc":"Vi 'workalike' with many additional features","homepage":"https://www.vim.org/","oldname":null,"aliases":["[email protected]"],"versions":{"stable":"8.0.1600","bottle":true,"devel":null,"head":"HEAD"},"revision":0,"version_scheme":0,"installed":[{"version":"8.0.1600","used_options":["--with-lua"],"built_as_bottle":false,"poured_from_bottle":false,"runtime_dependencies":[{"full_name":"perl","version":"5.26.1"},{"full_name":"libyaml","version":"0.1.7"},{"full_name":"openssl","version":"1.0.2n"},{"full_name":"readline","version":"7.0.3"},{"full_name":"ruby","version":"2.5.0"},{"full_name":"gdbm","version":"1.14.1"},{"full_name":"sqlite","version":"3.22.0"},{"full_name":"xz","version":"5.2.3"},{"full_name":"python","version":"3.6.4"},{"full_name":"lua","version":"5.3.4"}],"installed_as_dependency":false,"installed_on_request":true}],"linked_keg":"8.0.1600","pinned":false,"outdated":false,"keg_only":false,"dependencies":["perl","ruby","python","gettext","lua","luajit","python@2"],"recommended_dependencies":["python"],"optional_dependencies":["gettext","lua","luajit","python@2"],"build_dependencies":[],"conflicts_with":["ex-vi"],"caveats":null,"requirements":[],"options":[{"option":"--with-override-system-vi","description":"Override system vi"},{"option":"--with-gettext","description":"Build vim with National Language Support (translated messages, keymaps)"},{"option":"--with-client-server","description":"Enable client/server mode"},{"option":"--with-python@2","description":"Build vim with python@2 instead of python[3] support"},{"option":"--with-lua","description":"Build vim with lua support"},{"option":"--with-tcl","description":"Build vim with tcl support"},{"option":"--without-python","description":"Build vim without python support"},{"option":"--with-luajit","description":"Build with luajit support"}],"bottle":{"stable":{"rebuild":0,"cellar":"/usr/local/Cellar","prefix":"/usr/local","root_url":"https://homebrew.bintray.com/bottles","files":{"high_sierra":{"url":"https://homebrew.bintray.com/bottles/vim-8.0.1600.high_sierra.bottle.tar.gz","sha256":"a119989b2ffa4f5fff6a5366923a0f5672c04185c865d0861262edbb3b89154a"},"sierra":{"url":"https://homebrew.bintray.com/bottles/vim-8.0.1600.sierra.bottle.tar.gz","sha256":"84ddf8ede3f4eb0ec0aa5ba0986a3d89b10811c48363f24616c376596047f82d"},"el_capitan":{"url":"https://homebrew.bintray.com/bottles/vim-8.0.1600.el_capitan.bottle.tar.gz","sha256":"0d3302bc827c3b07589d9f57e6067b53e7080d27ac9622069c11fdc4d4c1764f"}}}}}]
とかしてinstalled_on_request
がtrue
かどうか確認します。
ちょっとわかりにくいので、もしjqコマンドとか入れてあれば
$ brew info --json=v1 vim|jq '.[].installed[].installed_on_request'
true
と確認出来ます。
見慣れないものでこれがfalse
なら何かのパッケージの依存で入れられてその元のパッケージは既に
アンインストールされたものなので既に要らないものになっていると思います。
そんな感じでbrew leaves
の結果を見ながら要らないものを削除していきますが、
削除時にそのパッケージだけが必要として入れられた依存先のパッケージも削除しないと
今度はそのパッケージがbreww leaves
の結果に出てきてまた削除する、みたいな面倒が起こります。
そこで、
rmtreeというbrew
のサブコマンドを導入して依存先のパッケージも同時に削除します。
インストール方法は
$ brew tap beeftornado/rmtree
これでbrew rmtree
というサブコマンドが使える様になります。
実行すると
$ brew rmtree vim
==> Examining installed formulae required by vim...
/
Can safely be removed
----------------------
vim
ruby
libyaml
Proceed?[y/N]:
こんな感じで依存先のパッケージも含めて一気に削除するかどうか聞かれます。
上のdeps
の結果から分かるようにvim
は他にもいくつかのパッケージに依存していますが、
それらは他のパッケージからも依存されているのでそういったパッケージはここには出てきません。
なので表示にもあるようにsafelyに消せるものだけを消すことが出来ます。
また、消す前に確認もされるので、この場合ruby
は削除したくない、というのであれば
N
を押して終了して
$ brew uninstall vim libyaml
と必要ないものだけをアンインストールすることも出来ます。
こんな感じで、
brew leaves
の結果から必要ないものをrmtree
で削除する。- 良くわからないものは
brew info --json=v1
で確認。 rmtree
の出力で残したいものがあれば個々にuninstall
。
- 良くわからないものは
と言った作業を繰り返します。
installed_on_request
がtrue
で無いものを一斉に削除したい場合は
Brew-fileのclean_non_request
コマンドを使うことも出来ます。
$ brew file clean_non_request
これだとdry runモードですがleaves
なものでかつinstalled_on_request
がtrue
で無いものを
リストしてくれます。
実際に全てuninstall
したい場合は
$ brew file clean_non_request -C
とします。
caskアプリの整理
cask
で入れたアプリに関してはcask list
に出てくるアプリで要らないものを削除するだけです。
brew cask uninstall
すればいいんですが、直接やってしまうと
通常は設定ファイルとかは残ったままになります。
ごみも残したくない場合は
AppCleaner
とかを使って直接削除した後
brew cask uninstall
を行います。
また、Brew-fileのcasklist
機能を使ってインストールされているアプリの中で
cask
でインストールできるけど直接インストールされたもの、などを探します。
もしあればcask
でインストールをし直します。
また、cask
もなく、App Storeやシステムアプリでも無いもので直接インストールしたものがあれば
cask
の自作も可能な限り行います。
整理している時に、brew uninstall
を行ってもbrew cask list
に残り続ける
アプリが出てくる事がありますが、これは
/usr/local/Caskroom/にアプリ名のディレクトリが残っていて
中身はすでに削除されてる様な状態です。(上の記事参照。)
/usr/local/Caskroom/にあるディレクトリを調べて中身が無いディレクトリは 何らかの不具合で残ってしまったゴミなので直接ディレクトリを削除してします。
どうもCaskの名前が変わったり他のアプリとまとめてインストールされる様になったりした際に 元のCaskのディレクトリが空のまま残ってしまったりするようです。
当然新しいマシンでbrew cask install
しようとするとエラーが出るので
きちんと削除しておいた方が良いです。
App Storeのアプリの整理
Brew-fileでは mas コマンドを使ってApp Storeのアプリも管理できます。
$ mas list
とすればApp Store経由で入れたアプリ一覧が出るので必要ないものを削除。
今回は無駄に数GBの容量を食っているGrageBandを削除しました。 楽曲を作れるアプリでmacOSでもiOS(iPhone)でも最初から入ってるアプリですが ほとんどの人は使わないままただただディスクを使われてるものだと思います。(そして意外と大きい。。。)
AppCleaner を使って削除しましたが それ以外にもゴミが残ってる可能性があるので以下も参照。
私の環境では一度も使ったことが無かったからか、上の記事にあるAudioの中のファイル等は一切ありませんでした。 (あったとしてもAppCleanerが見つけてくれるかもしれません。)
まあ、これに関してはここで削除しても新しい環境では最初からインストールされているので
新しい環境では手でアンインストールするか、
brew file init
する前にbrew file clean -C
する必要があります。
整理結果
整理した結果以下の様に減りました。
- brew package: 15898
- cask application: 6055
- App Store: 1612
brew leaves
で出てくるのは58個ほど。
もうちょっと減らせる感もありますが、無理して消すほどでもないのでこの程度でいいかな、と。