FreeBSDで明示的にインストールしたパッケージを一覧表示する
FreeBSDの新しいパッケージ管理システム(pkgng)では、pkg installでユーザーが明示的にインストールしたパッケージと、それを動かすために自動的にインストールされたパッケージが、内部的には厳然と区別されています。後者は、pkgngの用語で“automatic”、あるいは“autoremoveの対象”などと呼ばれているようです。
pkg autoremoveを使うと、明示的にインストールしたパッケージを出発点として依存関係をたどり、その時点で誰からも使われてないパッケージ(孤児パッケージ、orphan package)があれば削除してくれます。すべてのパッケージをpkgコマンドでインストールしていれば このような孤児パッケージはあまり発生しませんが、portsからインストールした場合は、「ビルドには必要だけど実行時には不要なパッケージ」が相当数、孤児バッケージとして出てきます。以前はpkg_cutleavesでこういうパッケージを削除していましたが、最近はそれがpkg autoremoveでできるようになったということですね。
では、明示的にインストールしたパッケージを一覧表示するにはどうすればよいのでしょうか。この操作、簡単にできてもよさそうなものですが、今のところはpkg queryを使ってpkgngが管理しているデータベースを覗くしか無いようです。
(2024年2月18日追記: 現在はpkg prime-list
で簡単に表示できるようになっています。→「パッケージマネージャの主要コマンド備忘録」)
具体的には下記のコマンドで、明示的にインストールしたパッケージの名前が一覧表示されます。
pkg query -e %a=0 %n
「-e %a=0」のところが検索条件を指定していて、「%a=0」は「autoremoveの対象で無いもの」を意味します。つまりこれが、明示的にインストールしたパッケージの一覧ということになります。ここを「%a=1」とすれば、「autoremoveの対象になるもの」、つまりpkgが自動的にインストールしたパッケージの一覧が得られます。
「%n」のところは検索結果の表示フォーマットを指定しています。他にも「%v」でバージョン、「%o」でオリジン(packageの生成元のportの名前)を表示させたりできます(これ以外の変数はpkg help queryを見てください)。もし名前、バージョン、オリジンを空白で区切って出力するなら
pkg query -e %a=0 "%n %v %o"
となります。フォーマット文字列の部分は、1つの引数としてシェルに解釈してもらうために” ”で囲んでいます。
時には、自分が明示的にインストールしようと思っていたパッケージが、別のパッケージの依存関係によって既にインストールされていた、という場合もあります。このようなとき、そのパッケージをautoremoveの対象から外すには、pkg setを使います。
pkg set -A 0 パッケージ名
「-A 0」がautoremoveの対象から外す、という意味です。逆にあるパッケージをautoremoveの対象にしたい場合は
pkg set -A 1 パッケージ名
とします。
よく見ればどれもマニュアルページに書いてある話なんですが、なかなかそこにたどり着けなかったので、備忘のためにメモしておきます。
※バージョンメモ
- FreeBSD 10.0-RELEASE-p8 amd64
- pkg-1.3.7