例によって自分用の備忘録を兼ねて。
FreeBSDには、あるportもしくはパッケージをアンインストールすると、そのパッケージが依存していたパッケージを自動的に削除する機能があります。下回りとしては pkg autoremove
がそれですね。また portmaster を使っている場合には portmaster -ds
というコマンドを使うこともあるでしょう。
これが実現できるのは、各パッケージが明示的にインストールされたのか、別のパッケージに必要だからインストール(=自動インストール)されたのか、その情報が記録されているからです。
しかしFreeBSDシステムをなんとなくで長期に運用していますと、この自動インストール情報が意図せぬ状態になり、pkg autoremove
/ portmaster -ds
では削除されないパッケージが出てきてしまうことがあるのです。portsの更新が途中で止まって続きから実行する時とか…
そこで本記事では、この自動インストールフラグを制御するコマンド+オプションを紹介します。うん、前置きが長くなっちゃった。
まずは自動インストールされた(=暗黙的にインストールされた)パッケージの一覧を取得してみましょう。
自動インストールされているパッケージの一覧
pkg query -e '%a = 1' %o
次に自動インストールされていない(=明示的にインストールされた)パッケージの一覧を取得してみましょう。
自動インストールされていないパッケージの一覧
pkg query -e '%a = 0' %o
pkg query
コマンドは条件に一致するパッケージを表示するコマンドです。-e
で条件を指定でき %a
は自動インストールフラグを意味しています。そして %o
はパッケージ名というかその元になった ports の名前ですね。
この2つのコマンドで、各パッケージが自分が意図したどおりの自動インストールフラグを持っているかどうか確認しましょう。
ここでは仮に lang/ruby に自動インストールフラグが付いていなかった、つまりフラグを付けたいとすると、以下の様なコマンドを実行します。
自動インストールフラグを立てる
pkg set -A 1 lang/ruby
このようにフラグを付けた後に pkg autoremove
を実行すると、もしも他のパッケージから使われていなければ、lang/ruby パッケージがアンインストールされるという寸法です。
逆に自動インストールフラグが付いてしまっていた、消したい場合には以下の様なコマンドになります。
自動インストールフラグを寝かす
pkg set -A 0 lang/ruby
なお pkg set
コマンドは引数に複数のパッケージ名を受け取れないので、一度に沢山のフラグを操作するには xargs -L 1
を併用すると良いんじゃないでしょうか。
pkg query -e '%a = 0' %o | grep ruby | xargs -L 1 pkg set -A 1
だいたいこんな感じで、名前に ruby
を含む全てのパッケージに対して、自動インストールフラグを設定できます。