rcmdnk's blog

人生を変える断捨離

新しいMacを設定する前に 余計なパッケージやアプリを入れないように これまで使っていたMacでBrew-fileのリストを整理しました。

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 installbrew uninstall時に自動的にBrewfileをアップデートする。
  • GitHubのレポジトリなどを使って管理が出来る。他のマシンとの共用がやりやすい(dotfiles的な)。
  • 複数のファイル形式がある(bundleの出力も読み込める)。

単にファイルにリストを書き出してそれをもとにインストールするだけなら、 brew listとかと簡単なシェルスクリプトでも出来てしまうことですが、 この辺の自動で管理することがしたくてBrew-fileを使っています。

brewパッケージの整理

これが一番やっかいですが、Homebrewでは 他のパッケージに依存しているものをインストールする際には 依存先のパッケージが入っていなければ自動的にインストールされます。

元のアンインストールする際にはそれらのパッケージはアンインストールされないので 長いこと使ってると使わないのに入ってるパッケージとかも結構あるはずです。

インストールした時に直接入れたのか何かの依存パッケージとして入ったのかは 去年、Homebrew導入された installed_on_request/installed_as_dependency という情報で見ることが出来ます。

ただ、この指標が導入される前にインストールされたパッケージに関しては これらの値がtrueとかfalseでなくてnullになってるので 分からない場合もあります。

また、たとえばpythonとかは普通に入れたいものだったりするかもしれませんが、 自分で入れるよりも先に他のパッケージの依存として入っていると installed_on_requestfalseになってることもあります。

なので、使うとしたら見覚えのないパッケージを調べてinstalled_as_dependencytrueかどうか見る、と言った感じでしょうか。

一方で、現在インストールされてるパッケージの依存関係などは

$ 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_requesttrueかどうか確認します。

ちょっとわかりにくいので、もし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_requesttrueで無いものを一斉に削除したい場合は Brew-fileのclean_non_requestコマンドを使うことも出来ます。

$ brew file clean_non_request

これだとdry runモードですがleavesなものでかつinstalled_on_requesttrueで無いものを リストしてくれます。 実際に全て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 を使って削除しましたが それ以外にもゴミが残ってる可能性があるので以下も参照。

How to Delete “GarageBand” from My Mac Chron.com

私の環境では一度も使ったことが無かったからか、上の記事にあるAudioの中のファイル等は一切ありませんでした。 (あったとしてもAppCleanerが見つけてくれるかもしれません。)

まあ、これに関してはここで削除しても新しい環境では最初からインストールされているので 新しい環境では手でアンインストールするか、 brew file initする前にbrew file clean -Cする必要があります。

整理結果

整理した結果以下の様に減りました。

  • brew package: 15898
  • cask application: 6055
  • App Store: 1612

brew leavesで出てくるのは58個ほど。 もうちょっと減らせる感もありますが、無理して消すほどでもないのでこの程度でいいかな、と。

Sponsored Links
Sponsored Links

« Touch Bar付きmacOS High Sierraの設定 新しいMacへのHomebrewなどを使ったアプリとかのインストール »

}