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