6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FreeBSDAdvent Calendar 2024

Day 1

pkg の情報のとり方を pkg.conf.sample にあるエイリアスを参考に勉強する

Last updated at Posted at 2024-12-01

pkg で情報取得

pkg コマンドで FreeBSDの package 管理はだいぶ便利になりました。
しかし、pkg install や upgrade を繰り返していくうちに、自分のマシンにインストールされている package の状況が複雑になっていき、どうなっているのかよくわからなくなっていくのもよくあることです

package を整理したり、トラブルシューティングしたりする場合に、現在の package のインストール情報を調べたいわけですが、そんなときに用意されているのが info や queue といったpkg のサブコマンドです。しかし、実際にこれらのコマンドでどんな情報が取れるのか、man で読んでもピンとこなかったりします。とくに queue コマンドはメタ文字と条件式を組み合わせて pkg のデータベースを検索するタイプのコマンドでとっつきにくいところがあります。

そこで参考になるのが、pkg をインストールすると入っている pkg.conf.sample 内にある ALIAS のサンプルです。pkg コマンドの package には /usr/local/etc/pkg.conf.sample という pkg.conf のサンプルが含まれていて、pkg コマンドのインストールですでに存在しています。

内容は、デフォルト値が#でコメントアウトされた形で記述されている、よくある設定ファルの.sampleファイルの形式なのですが、最後の部分にコメントアウトされていない内容があります。それが "ALIAS" オプションです。

pkg コマンドにはサブコマンドのエイリアス機能があります。よく使うサブコマンドとオプションの組み合わせに別名を与える機能で、/usr/local/etc/pkg.conf 内の "ALIAS" オプション指定で定義することができます。

pkg.conf.sample に定義されている ALIAS は、info や queue サブコマンドを使った情報のとり方の実例となっています。多分開発者が自身がよく使ってたエイリアスなんではないでしょうか。これらはそのままエイリアスとして利用することも、解析して情報のとり方の参考にするもできます。

エイリアスという形で"処理の塊"に名前がつくことで、「何をするか」の精神が伝わりやすくなっている気がします(個人の感想です)。まぁエイリアスの名称からなにができるか推察するのが困難なもののほうが多い気もしますが、わかった後見直すとそれなりに理解できる名前になっている感じです。

実際の ALIASの定義は以下の内容となっています(1.21.3)。

ALIAS              : {
  all-depends: query %dn-%dv,
  annotations: info -A,
  build-depends: info -qd,
  cinfo: info -Cx,
  comment: query -i "%c",
  csearch: search -Cx,
  desc: query -i "%e",
  download: fetch,
  iinfo: info -ix,
  isearch: search -ix,
  prime-list: "query -e '%a = 0' '%n'",
  prime-origins: "query -e '%a = 0' '%o'",
  leaf: "query -e '%#r == 0' '%n-%v'",
  list: info -ql,
  noauto = "query -e '%a == 0' '%n-%v'",
  options: query -i "%n - %Ok: %Ov",
  origin: info -qo,
  orphans: version -vRl\?,
  provided-depends: info -qb,
  rall-depends: rquery %dn-%dv,
  raw: info -R,
  rcomment: rquery -i "%c",
  rdesc: rquery -i "%e",
  required-depends: info -qr,
  roptions: rquery -i "%n - %Ok: %Ov",
  shared-depends: info -qB,
  show: info -f -k,
  size: info -sq,
  unmaintained = "query -e '%m = \"ports@FreeBSD.org\"' '%o (%w)'",
  runmaintained = "rquery -e '%m = \"ports@FreeBSD.org\"' '%o (%w)'",
  }

/usr/local/etc/pkg.conf.sample を /usr/local/etc/pkg.conf にコピーすれば、実際にこれらエイリアスが利用できるようになります。

この中で、いくつか個人的に参考となったエイリアスを紹介します。

自分で直接インストールした package を探す prime-list, noauto

package は自分で直接インストールしたものと、依存関係で自動的にインストールされたものがあります。 prime-list や noauto では、自分で直接インストールものだけを一覧表示します。prime-list は名前だけ、noauto は名前とバージョンを一覧取得できます。

定義は、

  prime-list "query -e '%a = 0' '%n'"
  noauto = "query -e '%a == 0' '%n-%v'",

となっていて、queue サブコマンドで %a (自動かどうかのフラグ)が 0 (つまり自動ではない) パッケージの名前を表示するという内容になっています(= と == に違いは無いようです)。このように、pkg のデータベースでは、自動インストールかどうかを記録していて、%a でチェックが可能であることがわかります。

依存されていない package を探す leaf

leaf は他のパッケージから依存されていないパッケージの一覧を取得します。自分で指定してインストールしたものもあれば、package 構成が変わって依存関係で自動でインストールしたものがすでに必要としていた package が無くなっているといったパターンがあります。後者の場合は現在自分が使っていないのであれば削除していいということになります。

エイリアスの定義は

  leaf: "query -e '%#r == 0' '%n-%v'",

となっています。%#r で取得できる被依存パッケージ数をチェックして、0 のもののパッケージとバージョンを取得しています。

ビルド時のオプションを調べる options, roptions

options は packageのビルド時に指定された ports のオプションを調べられます。なんの機能が有効になっているか表示して、"package に自分が欲しい機能が入ってない"疑惑の調査が行えます。自前で ports インストールした場合に便利だと思います。
options はすでにインストールされた package に対して、roptions はリモートチェックでインストール前に調べることができます。

エイリアスの定義は

  options: query -i "%n - %Ok: %Ov",
  roptions: rquery -i "%n - %Ok: %Ov",

%Okでオプションのキー名、%Ovで値を表示しています。

package の整理整頓、トラブルシューティングに

これらのエイリアスをそのまま使ったりもできますし、中身を読むことで自分の知りたい情報のとり方が学べ、package の整理整頓やトラブルシューティング時のヒント探しに役に立つのではと思います。実際に動かしてみると理解が深まると思うのでぜひ試してみてください。

6
3
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?