FreeBSD pkg コマンド概要

# はじめに
ＦｒｅｅＢＳＤにおけるサードパーティ製ツール導入のための仕組み（ports および packages）の充実によって、バイナリパッケージの利用が進化してきました。
特にフレイバー機能導入の恩恵は大きく、インストールされる内容は同一のものであるにも関わらず、依存するパッケージのバージョン依存のために、組み合わせが複雑になってしまうようなケースでも、シンプルにパッケージが用意できるようになっています。あとはその依存されるパッケージのバージョン全てに対してパッケージが用意されてれば…と思わなくも無いです。
ここでは、バイナリパッケージの恩恵を受けるべく、よく使うコマンドをとりまとめました。とは言え細かいオプションまで言及すると大変なので、よく使うオプションだけ明示していきます。
またほとんどのコマンドで実行の可否を聞いてきます。そのためほぼ共通と言っていい `-y` オプションがあったりするのですが、この辺りの説明は省きます。慣れたら使うようにしましょう。
その他にも、あまり実行事例を書いていません。使い方がよく分からない等ありましたらお知らせください。肉付けしたいと思います。

# よく使う pkg コマンド

ここではコマンド名（サブコマンド名）に対して `[R]` と `[L]` のマークを付けておきます。これは以下の通りとなります。

- `[R]`： 外部パッケージ／リポジトリに存在する情報を参照します。
- `[L]`： インストール済みまたはローカルファイルシステムに存在するパッケージに対する情報を参照します。
- `[RL]`： 環境に応じて `[R]` にも `[L]` にも振る舞います。

## pkg update [R]
パッケージメタデータを収集するためのコマンドです。何よりも先にメタデータの収集が必要となります。
この辺りは `yum check-update` に通じるものがあります。
なお、常に必要なコマンドというのではなく、自動的にメタデータの更新を実施してから動くコマンドはあるので、それが気にならないなら実行する必要はないです。
具体的には以下のサブコマンドでは最新のメタデータに基づいて実行します。

- `pkg install`
- `pkg upgrade`
- `pkg version`
- `pkg search`
- `pkg fetch`
- `pkg rquery`

## pkg install [R]
パッケージのインストールを行います。後述する `pkg add` との違いは、キーワードで特定＆ネットワーク取得からのパッケージのインストールとなります。

## pkg add [L]
指定されたパッケージファイルのインストールを行います。前述の `pkg install` と違い、パッケージファイル名を明示してのインストールとなります。

## pkg delete [L]
指定されたパッケージを削除します。

### pkg delete -ayf
全ての（`-a`）パッケージを無慈悲（`-f`）かつ問答無用（`-y`）で削除します。直観的には `-ay` オプションの指定で十分なのですが、依存関係の都合で消せないケースでは `-f` オプションの指定が必要となります。
どのみち全部消すつもりなら遠慮会釈無く全部指定しましょう。

## pkg version [RL]
パッケージのバージョン比較を行います。一言で言うには癖が強いので、ユースケースを分解して解説します。

- デフォルトで `/usr/ports/INDEX-ＯＳメジャーバージョン` と言うメタファイルとの比較を行います。
- このファイルが存在しない場合、各 ports のオリジン（ディレクトリ）を参照します（`-P` オプション指定相当）。
- またこのディレクトリが存在しない場合、リモートリポジトリを参照します（`-R` オプション指定相当）。

前者２ケースの場合は `[L]` 相当で、後者のケースでは `[R]` 相当となります。

### pkg version -L =
通常は `-L` オプションを指定して、インストール済みパッケージとの比較を行い、イコールで「無い」ものを表示します。イディオム的に `=` しか指定しないものと思って問題無いです。参考として `=` の他に `>`、`<`、`?`、`!` の指定が可能ですが、どれもこれもクォートが必要な文字となっています。

各文字の意味は下記の通りですが、`-L` オプションの場合、その文字以外という意味になります。逆にその文字の意味が欲しい場合は `-l` オプションを使用します。

- `>`： 現在インストールされているものより新しいバージョンがリリースされている場合
- `=`： 現在インストールされているものと同等のバージョンがリリースされている場合
- `<`： 現在インストールされているものより古いバージョンがリリースされている場合、通常メタデータが更新されていない、新しい ports のテストインストールといったケースで発生する
- `?`： 現在インストールされているパッケージのオリジンが存在しない（削除またはリネームにより）ため、バージョン比較ができない場合
- `!`： 現在インストールされているバージョンとのバージョン比較ができない場合

### pkg version -t
任意のバージョン番号（＝ただの文字列）を指定して比較、その結果を返します。これはパッケージのための機能というよりも、多種多様なバージョン番号をテストするための機能となります。これだけ他のサブコマンドと比較して、毛色が違う機能になります。
特にα版、β版といったバージョン指定の置き換えの際に、どっちが大きくて（最新）、どっちが小さい（最古）かわからないケースをトライ＆エラーするために存在しています。
バージョン比較についてのルールについては [FreeBSD Porter's Handbook - 5.2.2. Versions, DISTVERSION or PORTVERSION](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-versions) をご覧ください。

## pkg upgrade [R]
指定されたパッケージを更新します。特に指定がない場合は全てのパッケージに対して更新可否を確認して更新しようとします。

## pkg info [L]
指定されたパッケージ情報を表示します。指定されない場合、全てのパッケージの概要を一覧表示します。

### pkg info -a
他のオプションと合わせて指定した場合、全てのパッケージが対象になります。

### pkg info -l
指定されたパッケージのインストールされたパス名一覧を表示します。

### pkg info -D
指定されたパッケージに関する注意書きを表示します。セットアップのヒント情報などが含まれていることがあります。

## pkg lock [L]
指定されたパッケージを更新されないよう、ロックします。このロックすることの影響は、パッケージ自体の変更を防止する以上に機能するようになっています。

- ロックされたパッケージの再インストール・アップグレード・ダウングレード・削除のブロック
- ロックされたパッケージに依存するパッケージが、ロックされたパッケージの別のバージョンに依存する場合の、当該パッケージのアップグレードまたはダウングレードのブロック
- ロックされたパッケージが依存しているパッケージの、削除またはアップグレードまたはダウングレードのブロック
- 上記に関して間接的に依存が共有している場合にもブロックの対象となる

## pkg unlock [L]
指定したパッケージのロックを解除します。

## pkg search [R]
パッケージ名を大文字小文字と問わず、正規表現で検索します。
`-e` オプションで厳密に指定できますが、バージョン番号の指定含めての検索になるので、あまり人間向けのオプションではありません。
`-g` オプションはシェルグロブ的（`?` や `*` で曖昧検索する）に検索できますが、バージョン番号込みの検索となるため、事実上、最後に `*` が必要となります。

## pkg which [L]
指定したファイル、ディレクトリ等が所属しているパッケージ名を表示します。`-o` オプションでオリジンを表示することができます。

# 滅多に使わないけど知っておいた方がいい pkg コマンド

## pkg audit [RL]
インストールされたパッケージの、脆弱性情報との突合結果をレポートします。
外部から脆弱性情報を取得する必要があるためため、若干 `[R]` よりの機能ですが、今すぐ情報を更新したいという事情が無ければわざわざ `-F` オプションを指定して、脆弱性情報の取得は行わなくてもよいです。
これは通常、一日に一回脆弱性情報を取得するスクリプトが脆弱性情報を自動取得しているからです。

## pkg check -s [L]
指定されたパッケージが改変されてないか一貫性を検査します。通常 `-a` オプションと合わせて使用することになります。

## pkg check -d [L]
指定されたパッケージの依存が壊れていないか一貫性を検査します。通常 `-a` オプションと合わせて使用することになります。

## pkg autoremove [L]
孤立したパッケージを削除します。「孤立した」というのは、何か別のパッケージの依存関係のためにインストールされ、当該パッケージが削除された、ないしは（更新等により）依存されなくなって、使われなくなった…ものとなります。

実際に「孤立した」パッケージを「使ってる」ケースがあるかもしれませんが、パッケージ依存情報からは読み取れないため、その実行には注意する必要があります。
たとえば `bash` を普段使用しているが、何かの依存で `bash` がインストールされたので、そのまま使ってるぞ…というケースは要注意となります。
明示的に `bash` をインストールするか、後述のテクニックで逃げる方法があります。

ports system の場合わかりやすく、「主に」ビルド時に必要なパッケージ（コンパイラ等）が削除対象となります。

## pkg updating [L]
パッケージの要注意アップデート手順（手動更新の指示）を表示します。具体的には `/usr/ports/UPDATING` を読んで必要そうな箇所を、インストールされている（または指定された）パッケージ情報からマッチングして、表示します。
同ファイルは、人間が読む前提で、かなりヒューリスティックな作りになっているのですが、厳密性については微妙なものがあります。
また同ファイルが存在することが必要で、わざわざダウンロードしてこない点も微妙です。

## pkg set [L]
指定されたパッケージのメタデータ（データベース）を変更します。通常は `pkg updating` 情報に基づき実行されるくらいの存在なので、主体的に操作することは無いはずです。

### pkg set -A
`-A` オプションに対して以下の値を指定して、指定したパッケージのメタデータを変更します。この変更は `pkg autoremove` の結果に影響を与えます。

- `0`： 指定したパッケージを `pkg autoremove` の対象にしません。
- `1`： 指定したパッケージを `pkg autoremove` の対象にします。

この項目に興味ある人は `pkg autoremove` の動作原理について気になるかと思いますが、このフラグが有効でかつ、他のパッケージから依存が無いこと、といった判定になるため、単純にこのフラグだけで `pkg autoremove` の対象にはなりません。

また `pkg install` または `pkg add` で直接指定したものは、インストール時にこのフラグが無効になるよう設定されます。あくまで依存の都合でインストールされたパッケージに対してのみ、このフラグが有効になります。

### pkg set -o
`-o 旧オリジン:新オリジン` という形で、旧オリジンに依存している全てのパッケージのメタデータのオリジン情報を変更します。

### pkg set -n
`-n 旧パッケージ名:新パッケージ名` という形で、パッケージ名の変更を行います。ただまぁパッケージ名にバージョン番号含まれるか…と言われると含まれないので、色々微妙な存在ではあります。

# マニアック過ぎて知らなくても良い pkg コマンド

## pkg alias [L]
`/usr/local/etc/pkg.conf` にて定義されるエイリアス情報を表示します。

## pkg query [L]
指定されたフォーマットでパッケージのメタ情報を表示します。パッケージ名が指定されない場合、全てのパッケージが対象となります。
フォーマットで指定できる文字列は下記のものがあります。

- `%n`： パッケージの名前
- `%v`： パッケージのバージョン
- `%o`： パッケージのオリジン
- `%p`： パッケージのプレフィックス
- `%m`： パッケージのメンテナー（メールアドレス）
- `%c`： パッケージのコメント
- `%e`： パッケージの記述
- `%w`： パッケージのＷｅｂサイト
- `%l`： パッケージのライセンスロジック（無し・単一・ａｎｄ・ｏｒ）
- `%sb` または `%sh`： パッケージのサイズ（バイト単位または人間が読みやすい単位付）
- `%a`： パッケージの自動インストールフラグ
- `%Q`： パッケージのアーキテクチャ対応候補
- `%q`： パッケージのアーキテクチャ（ＯＳ、バージョン、ＣＰＵアーキテクチャ）
- `%k`： パッケージのロックフラグ
- `%M`： パッケージのメッセージ
- `%t`： パッケージがインストールされた時のタイムスタンプ
- `%R`： パッケージのインストール元リポジトリ
- `%X`： パッケージのチェックサム
- `%?Ｃ`： `Ｃ`（具体的には `d`/`r`/`C`/`F`/`O`/`D`/`L`/`U`/`G`/`B`/`b`/`A`・説明は省略）として指定された状況のフラグ
- `%#Ｃ`： `Ｃ`（具体的には `d`/`r`/`C`/`F`/`O`/`D`/`L`/`U`/`G`/`B`/`b`/`A`・説明は省略）として指定された内容の数
- `%dＣ`： パッケージの依存しているパッケージのリスト、`Ｃ`（具体的には `n`/`o`/`v`）により `N`ame、`O`rigin、`V`ersion` を取得
- `%rＣ`： パッケージの逆に依存しているパッケージのリスト、`Ｃ`（具体的には `n`/`o`/`v`）により `N`ame、`O`rigin、`V`ersion` を取得
- `%C`： パッケージのカテゴリ一覧
- `%FＣ`： パッケージのファイル一覧、`Ｃ`（具体的には `p`/`s`）により `P`ath または `S`um を取得
- `%D`： パッケージのディレクトリ一覧
- `%OＣ`： パッケージのオプション一覧、`Ｃ`（具体的には `k`/`v`/`d`/`D`）により`k`ey、`v`alue、`d`efault value、`D`escrition を取得
- `%L`： パッケージのライセンス一覧
- `%U`： パッケージのユーザー一覧
- `%G`： パッケージのグループ一覧
- `%B`： パッケージのプログラム内で使用している共有ライブラリの一覧
- `%b`： パッケージの提供している共有ライブラリの一覧
- `%AＣ`： パッケージの注釈タグの一覧、`Ｃ`（具体的には `t`/`v`）により `t`ag、`v`alue を取得

よくあるイディオムとしては `%n-%v` があります。こちらはパッケージ名となります。

### pkg query -e
指定されたクエリーに合致するパッケージを絞り込む。評価可能なパターンとしては以下のモノがあります。これらは右辺として指定します（左辺では指定できません）。

- `%n`： パッケージの名前（文字列型）
- `%o`： パッケージのオリジン（文字列型）
- `%p`： パッケージのプレフィックス（文字列型）
- `%m`： パッケージのメンテナー（メールアドレス・文字列型）
- `%c`： パッケージのコメント（文字列型）
- `%e`： パッケージの記述（文字列型）
- `%w`： パッケージのＷｅｂサイト（文字列型）
- `%s`： パッケージのサイズ（バイト単位・数値型）
- `%a`： パッケージの自動インストールフラグ（数値型）
- `%q`： パッケージのアーキテクチャ（ＯＳ、バージョン、ＣＰＵアーキテクチャ・文字列型）
- `%k`： パッケージのロックフラグ（数値型）
- `%M`： パッケージのメッセージ（文字列型）
- `%t`： パッケージがインストールされた時のタイムスタンプ（数値型）
- `%i`： パッケージに関する追加情報（文字列型）
- `%#Ｃ`： `Ｃ`（具体的には `d`/`r`/`C`/`F`/`O`/`D`/`L`/`U`/`G`/`B`/`b`/`A`・説明は省略）として指定された内容の数

演算子としては以下のモノがあります。

- `||`： 「または」として２つの評価を結合します。
- `&&`： 「かつ」として２つの評価を結合します。
- `~`： `%var ~ グロブ` として文字列をグロブパターンとしてマッチ「する」か評価します。
- `!~`： `%var !~ グロブ` として文字列をグロブパターンとしてマッチ「しない」か評価します。
- `>` または `>=`： `%var >[=] 数字` として「より大きい」または「以上」か評価をします。
- `<` または `<=`： `%var <[=] 数字` として「より小さい」または「以下」か評価をします。
- `=` または `==`：  `%var =[=] 数字または文字列` として一致「する」か評価します。
- `!=`： `%var != 数字または文字列` として一致「しない」か評価します。
- `=~`： `%var =~ 数字または文字列` として大文字小文字を区別せずに一致「する」か評価します。
- `!=~`： `%var !=~ 数字または文字列` として大文字小文字を区別せずに一致「しない」か評価します。

### pkg rquery [R]
リモートメタデータに対する `pkg query`。こちらは特に説明しません。`pkg query` を参照のこと。

### pkg anotate [L]
パッケージに対して「注釈情報タグ」を追加・変更・削除するコマンドです。表示に関しては `pkg info -A` で確認できます。注釈タグについての意味や活用方法等は特に説明しません。

## pkg shell [L]
パッケージメタデータを管理しているデータベース（＝ＳＱＬｉｔｅ３）に直接アクセスするためのコマンドです。せいぜい `pkg shell VACUUM` くらいしか使い道がありません。
クエリーを活用したいなら `pkg query` で十分お釣りが来るレベルのツールとなります。

# 便利なエイリアスコマンド

## 自動インストールフラグ関連
以下のエイリアスは自動インストールフラグを参照し、自動インストールフラグが０であるもの＝明示的に指定インストールされたものを返すコマンドです。

- `pkg prime-list` [L]
- `pkg prime-origins` [L]
- `pkg noauto` [L]

## pkg leaf [L]
リーフ（依存木の葉）に存在するパッケージを表示します。これにあって `pkg noauto` に無いものが `pkg autoremove` の対象となります。

## pkg list [L]
指定したパッケージがインストールしたパス名一覧。

## シンタックスシュガー
単純にどちらで実行しても良い用のエイリアス。なんなら `pkg vanish` みたいな中二病溢るる ~~パワーワード~~ 力強い単語を使用してサブコマンドを定義しても問題ありません。デフォルトで無難なものが定義されてます。

- `pkg remove` ＝ `pkg delete`

# 知らんわこんな pkg コマンド

ほとんど内部で使用するコマンドであったり、別のツール（別のパッケージ管理システムから FreeBSD pkg システムへの登録など）からの呼び出しで使われるようなものなので知らなくても問題無いです。

- `pkg stats`： 統計情報の表示。
- `pkg clean`： パッケージキャッシュの削除。
- `pkg config`： `/usr/local/etc/pkg.conf` で設定されてる内容の参照（大文字小文字区別無し）。
- `pkg create`： パッケージの作成…なんだけど、ports ビルド時にはよく使うけど、単体で使うケースはあまり無い。
- `pkg fetch`： パッケージの取得。`pkg install` ＝ `pkg fetch` ＋ `pkg add` な関係。
- `pkg register`： パッケージのローカルデータベースへの登録。これ完全に内部で使ってる用としか。
- `pkg repo`： パッケージリポジトリカタログの作成。この辺りは pkg-repository(5) を参考にリポジトリ作ってみるしか。
- `pkg shlib`： パッケージが提供している共有ライブラリおよびそのライブラリに依存する別のパッケージの表示。これは主にセキュリティ診断用ですね。
- `pkg ssh`： 完全に内部で使用する用で人間が使うためのコマンドでないので省略。
- `pkg triggers`： 延期されたトリガーの実行。誰が延期したの？から含めて内部で使用しているので省略。

# クエリー（pkg-query）

## あるパッケージに依存する、明示的な指定によりインストールされたパッケージを調べたい。

例として Python 3.11 に依存する全てのパッケージにおいて、明示的に指定してインストールしたパッケージ一覧の取得する方法について。
まずは `pkg info -r python311` （パッケージ名での指定）を実行することで、Python 3.11 に依存するパッケージをリストアップします。
あるいは `pkg query '%ro' python311` としてオリジンでリストアップすることができます。
またパッケージ名ではなく `lang/python311` のようなオリジンで指定することもできます。

取得したパッケージ名（またはオリジン）の自動インストールフラグを見て、一覧をリストアップします。
具体的には下記のような形になります。

```shell
pkg query -e "%a = 0" "%n" $(pkg info -r python311)
  あるいは
pkg query -e "%a = 0" "%n" $(pkg query '%ro' python311)
```

一発で結果を出せるクエリーができそうに無かったので、`pkg shell` を使った例として下記のようにして調べてることができなくもないです。
こちらは参考まで。データベース構成が変更されることがあり得るので、将来動かなくなる可能性があります。

```shell
pkg shell -cmd "SELECT p.name FROM deps AS d INNER JOIN packages AS p ON package_id = p.id WHERE d.origin = 'lang/python311' AND p.automatic = 0" < /dev/null
```

# よくある質問とその答え

## Ｑ．オリジンは？
Ａ．オリジンとはＴＯＤＯ。気が向いたら書く。

## Ｑ．pkg コマンドはパッケージなのですか？
Ａ．そうです。pkg コマンドはパッケージです。

## Ｑ．あれ？ /usr/sbin/pkg は？
Ａ．pkg パッケージをインストールするだけのブートストラップです。その後、pkg パッケージ（`/usr/local/bin/pkg-static`）を呼び出します。

## Ｑ．あれ？ベースシステムには入らないの？
Ａ．旧パッケージシステムで散々な目にあってこういう形態になっています。pkg コマンドが進化しないと何もできませんでした（新しいバージョンがリリースされても古い機能を強要される）。

## Ｑ．pkg コマンドと pkg-static コマンドの違いは？
全く同じです。pkg-static は自分自身の削除といった微妙な操作で必要になります。通常は pkg コマンドを使ってればいいです。ある種の内部処理で実行する場合に安全のため使用されています。

## Ｑ．pkg update で取得したリポジトリ情報を削除する方法は？
Ａ．自分も興味あるので調査中。

## Ｑ．pkg query だと上手く絞り込みできないんですよね。最後にインストールしたパッケージを…な出力をしたいケースの時どうすればいいですか？
Ａ．`pkg shell` で頑張ろう。レッツＳＱＬ！というのは置いておいて、お悩みの通り `pkg query` には出力順序や集計機能がありません。あるいはパイプで繋いで他のツール（`sort` や `awk`、`head`、`tail` など）を駆使するのも手かと思います。

## Ｑ．これマジ全部覚えてるの？
Ａ．よく使うのは憶えてる。自分も数個くらいだと思ったけど、十数個がそれなり出てきて記憶に頼って書いてるから、十分憶えるに値するかと。細かいニュアンスが微妙なものもあったけど、そこはマニュアルを精査するということで。
まぁ普段遣いしないものは記憶の彼方に置き去って問題無いです。

`pkg query` と `pkg shell` は使う機会が無かったですが、凝った調べ物したついで追記しました。まぁ `pkg shell` は結果だけだけど。

## Ｑ．pkg update/upgrade/updating 何かむずい。
Ａ．残念ながら憶えておいてください。別のパッケージシステムだと `update` と `upgrade` が同じだったりしますが、残念なこｔ（メッセージはここで途切れています

## Ｑ．WITH_PKGNG とか pkg2ng って？
極めて古い話（10.0-RELEASE よりも前）なので、その部分の話は無視してください。歴史的価値しか無く、設定や運用での価値は今やゼロです。

# 愚痴
これくらい知ってるよねぇ…とリストアップした直後の絶望感。普段遣いとは？でもこれくらい載せておかないと…の地獄感。
更にマニュアル読んでたらバグ（[pkg-query(8): duplicate %#b](https://github.com/freebsd/pkg/issues/2213)）を発見。 orz

# 参考文献
- [FreeBSD pkg](https://github.com/freebsd/pkg)
- [pkg(8)](https://man.freebsd.org/cgi/man.cgi?pkg)
- [pkg update(8)](https://man.freebsd.org/cgi/man.cgi?pkg-update)
- [pkg install(8)](https://man.freebsd.org/cgi/man.cgi?pkg-install)
- [pkg add(8)](https://man.freebsd.org/cgi/man.cgi?pkg-add)
- [pkg delete(8)](https://man.freebsd.org/cgi/man.cgi?pkg-delete)
- [pkg version(8)](https://man.freebsd.org/cgi/man.cgi?pkg-version)
- [pkg upgrade(8)](https://man.freebsd.org/cgi/man.cgi?pkg-upgrade)
- [pkg info(8)](https://man.freebsd.org/cgi/man.cgi?pkg-info)
- [pkg lock(8)](https://man.freebsd.org/cgi/man.cgi?pkg-lock)
- [pkg unlock(8)](https://man.freebsd.org/cgi/man.cgi?pkg-unlock)
- [pkg-search(8)](https://man.freebsd.org/cgi/man.cgi?pkg-search)
- [pkg-which(8)](https://man.freebsd.org/cgi/man.cgi?pkg-which)
- [pkg-audit(8)](https://man.freebsd.org/cgi/man.cgi?pkg-audit)
- [pkg-check(8)](https://man.freebsd.org/cgi/man.cgi?pkg-check)
- [pkg-autoremove(8)](https://man.freebsd.org/cgi/man.cgi?pkg-autoremove)
- [pkg-updating(8)](https://man.freebsd.org/cgi/man.cgi?pkg-updating)
- [pkg-set(8)](https://man.freebsd.org/cgi/man.cgi?pkg-set)
- [pkg-alias(8)](https://man.freebsd.org/cgi/man.cgi?pkg-alias)
- [pkg-query(8)](https://man.freebsd.org/cgi/man.cgi?pkg-query)
- [pkg-rquery(8)](https://man.freebsd.org/cgi/man.cgi?pkg-rquery)
- [pkg-anotate(8)](https://man.freebsd.org/cgi/man.cgi?pkg-anotate)
- [pkg-shell(8)](https://man.freebsd.org/cgi/man.cgi?pkg-shell)
- [pkg-stats(8)](https://man.freebsd.org/cgi/man.cgi?pkg-stats)
- [pkg-clean(8)](https://man.freebsd.org/cgi/man.cgi?pkg-clean)
- [pkg-config(8)](https://man.freebsd.org/cgi/man.cgi?pkg-config)
- [pkg-create(8)](https://man.freebsd.org/cgi/man.cgi?pkg-create)
- [pkg-fetch(8)](https://man.freebsd.org/cgi/man.cgi?pkg-fetch)
- [pkg-register(8)](https://man.freebsd.org/cgi/man.cgi?pkg-register)
- [pkg-repo(8)](https://man.freebsd.org/cgi/man.cgi?pkg-repo)
- [pkg-shlib(8)](https://man.freebsd.org/cgi/man.cgi?pkg-shlib)
- [pkg-ssh(8)](https://man.freebsd.org/cgi/man.cgi?pkg-ssh)
- [pkg-triggers(8)](https://man.freebsd.org/cgi/man.cgi?pkg-triggers)
- [pkg-repository(5)](https://man.freebsd.org/cgi/man.cgi?pkg-repository)
- [FreeBSD Ports Flavors](https://www.slideshare.net/YuichiroNaito/freebsd-ports-flavors)
- [FreeBSD Porter's Handbook - 7. Flavors](https://docs.freebsd.org/en/books/porters-handbook/flavors/)
- [FreeBSD Porter's Handbook - 5.2.2. Versions, DISTVERSION or PORTVERSION](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-versions)
- [FreeBSD Porter's Handbook - 13. pkg-* files](https://docs.freebsd.org/ja/books/porters-handbook/pkg-files/)
- [FreeBSD pkg コマンドチート](https://qiita.com/taku39@github/items/c29a47d5ac07492d4857)
- [【FreeBSD】pkgで普段使うサブコマンド達](https://hacolab.hatenablog.com/entry/2020/02/16/170000)
- [pkg](https://kaworu.jpn.org/freebsd/pkg)
- [FreeBSD – パッケージソフトのインストールと削除、アップデートのやり方](https://blog.it-see.net/it-dokata/freebsd/pkg/)
- [パッケージコマンド早見表](https://freebsd.seirios.org/doku.php?id=ports:pkg_yum_apt)
- [アプリケーションをインストールする (前編): packages](https://retrotecture.jp/freebsd/app1_packages.html)
- [FreeBSD 13.0 RELEASE -  ports・pkg - pkg](https://freebsd.sing.ne.jp/fbsd/1300/03/03.html)