
私はFreeBSDのpkg_add
コマンドを使って、一度ビルドして複数のマシンにインストールするシナリオでバイナリパッケージをインストールおよびアップグレードしようとしています。新しいパッケージをインストールするときはうまく機能しますが、アップグレードは私を困惑させています。たとえば、依存していた別のパッケージによって、インストールすることはできません。
# pkg_add /path/to/somepackage-2.0.tbz
pkg_add: package 'somepackage' or its older version already installed
-f
この時点で、次のコマンドを渡すと、パッケージの古いバージョンを削除できますpkg_delete
。
# pkg_delete -f somepackage-1.0
pkg_delete: package 'somepackage-1.0' is required by these other packages
and may not be deinstalled (but I'll delete it anyway):
anotherpackage-1.0
しかし...これが致命的です...依存関係情報が消えてしまいました! アップグレードをインストールできます:
# pkg_add /path/to/somepackage-2.0.tbz
そして、これを削除しようとすると、エラーが発生することなく成功します。
# pkg_delete somepackage-2.0
これを適切に処理するにはどうすればよいでしょうか (ここでの「適切に」とは、「依存関係チェーン全体を再構築/再インストールする必要なく、依存関係情報を保持する方法」を意味します)。
ありがとう!
答え1
ご存知のとおり、pkg_add
ポートを正常にアップグレードすることはできません。portupgrade
ただし、パッケージはこれを非常にうまく実行します。これは私が使用し、推奨する方法です (この方法が気に入らない場合は、他の方法も利用できます)。
ポートがインストールされたら、 を実行するだけでportupgrade -aPP
、パッケージを使用してシステムにインストールされているすべてのポートをアップグレードできます。すべてのポートを更新したくない場合は、 を実行して、portupgrade -RPP [category/port]
特定のポートとそれが依存するポートをアップグレードできます。引数なしでプログラムを実行すると、現在のディレクトリに属するポートがアップグレードされます (つまり、 がcd /usr/ports/security/openssl ; portupgrade
アップグレードされます。オプションopenssl
なしでは、-PP
ソースからポートがビルドされます)。また、ポート ディレクトリにいない場合は、ヘルプが表示されます (オプションと同じ-h
)。
編集:
デフォルトでは、portupgrade は、環境変数で定義されたディレクトリPKG_PATH
(デフォルトは$PACKAGES/All
、$PACKAGES
デフォルトは$PORTSDIR/packages
なので、デフォルトのパスは/usr/ports/packages/All
) にパッケージが存在する場合にパッケージをインストールします。
そこに存在しない場合は、パッケージは (優先設定により) (サブフォルダーと$PKG_SITES
を含む URI を取ります。デフォルト値はありません)、または(その下に通常のミラー パスを含む URI を取ります。デフォルトは です) からダウンロードされます。Latest
All
$PACKAGEROOT
"ftp://ftp.freebsd.org"
これを行う簡単な方法の 1 つは、1 台のマシンを使用して、他のマシンにインストールされるパッケージをビルド/キャッシュすることです。
- ポートのディレクトリ内のポート ツリーからパッケージをビルドできます
make package
(これによりポートもインストールされます)。 - 1 台のマシンをアップグレードし、他のマシンで使用するためにパッケージ ファイルをキャッシュするには、前述のコマンドを使用します
portupgrade
。パッケージ ファイルは、デフォルトのディレクトリ (上記を参照) にキャッシュされます。 portupgrade -aPPF
または を使用して、portupgrade を使用すると、パッケージを取得するだけでインストールは行いませんportupgrade -RPPF [category/port]
。
キャッシュされたパッケージ ファイルを取得したら、他のマシンからファイルにアクセスできる限り、NFS、FTP、HTTP などを介してディレクトリを共有できます。 または をPACKAGES
適切PKG_SITE
な値に設定して、キャッシュ サーバーを指定します。通常のportupgrade
コマンドを実行すると、キャッシュ サーバーからパッケージが取得され、インストールされます。
注: 正しく動作するには、すべてのサーバーでポート ツリーが最新である必要がありますportupgrade
(ローカル ポート ツリーにあるバージョンに更新しようとします)。すべてのコンピューターに同じポート/パッケージをインストールする場合は、1 つのサーバー/usr/ports
ディレクトリを共有し (たとえば NFS 経由)、それを他のすべてのサーバーにマウントするのが最も簡単です。
答え2
たぶん、pkg_replace
あなたが探しているのはそれでしょう。
私はこれをかなり長い間使っています。私の FreeBSD マシンの 1 つはビルド サーバーとして機能し、portmaster
他のマシンのすべてのパッケージをビルド (使用) します。私はこれを使用して、pkg_replace
他のすべてのマシンにこれらのビルド済みパッケージをインストールしています。
http://www.FreeBSD.org/cgi/url.cgi?ports/ports-mgmt/pkg_replace/pkg-descr
答え3
または、ここで説明されている Portsnap または CVSup を利用することもできます。
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/ports-using.html