質問:perl5 のデフォルトバージョンを変更すると、しばらくの間 pkg version -L = の結果が > になってしまうのは何故でしょう。
回答1
結論から言えば /usr/ports における make index (/usr/ports/INDEX-n)の生成タイミングとの差違による。
デフォルトバージョンを変える前にこのファイルが作成されると、旧 perl5 のバージョンが記録されるため、
デフォルトバージョンを変更した後の perl5 のバージョンとの比較の結果、「>」になってしまう。
よって、デフォルトバージョン変更後は、再度 make index を実施すれば問題は解消される。
回答2
/usr/ports だけを更新していることが原因ではないでしょうか。/usr/ports の内容を自分で編集したり ports の開発を行っているのでなければ、/usr/ports を更新した後に、make fetchindex を実行することをお勧めします。これで、表示されるバージョン番号の不整合は発生しません。
技術的には、次のような背景があります。pkg versionは、バージョン情報を次の場所から取得します。
/usr/ports/INDEX-n が存在する場合、それを使います。
このファイルには /usr/ports のパッケージのバージョン番号と依存関係が書かれています。内容は /usr/ports 以下のファイルの要約です。/usr/ports ディレクトリで make indexを実行すると、再生成されます。ただし、再生成にはとても長い時間がかかりますので注意してください。
Subversion等で /usr/ports 以下のファイルを更新した場合は内容が古いままになりますので、pkg version の表示が正しく出てこなくなります。再生成すれば直ります。もし/usr/ports以下を手動で変更していなければ、FreeBSDプロジェクトが配っている最新版をダウンロードするのが簡単でしょう。make fetchindexとすると、再生成ではなくダウンロードしてくれます。配布しているファイルの更新は非常に高い頻度で行われているため、不整合が生じることはほとんどありません。
/usr/ports/INDEX-n が存在しない場合は、/usr/portsの下のファイルを調べて、バージョンを比較します。正確な内容が表示されますが、時間がかかります。
/usr/ports と /usr/ports/INDEX-n の両方が存在しない場合は、pkg サーバにある情報にアクセスしてバージョンを比較します。サーバにある情報は/var/db/pkg にキャッシュが保存され、キャッシュの内容が古ければ自動的に更新されます。
したがって/usr/portsの更新方法にもよりますが、INDEX-n が存在している場合、それを更新しないと情報に不整合が生じます。
上記 3 パターンを強制的に指定することも可能です。
/usr/ports 以下のファイルを個々に調べて正確な情報を得るには、-Pフラグをつけて pkg version -L を実行します。かなり時間がかかりますが、自分でバージョン番号を編集したり、FreeBSDプロジェクトが管理している ports tree に入っていないものを追加している場合にも正確な情報が得られる方法の一つです。
/usr/ports/INDEX-n を使って情報を得るには、-I フラグを付けます。-I /tmp/INDEX-n のように、ファイル名を指定することも可能です。処理は高速ですが、INDEX-nファイルが/usr/portsの内容と合っていないと、正しい情報が得られません。
プロジェクトが管理しているpkgサーバの情報を使うには、-Rフラグを付けます。ローカルキャッシュよりもサーバの情報が新しい場合には自動更新が行われますが、-R に加えて -Uフラグを付けると、自動更新を抑制することが可能です。