我正在嘗試使用 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
(採用帶有子資料夾的 URILatest
且All
無預設值)或$PACKAGEROOT
(採用具有正常鏡像路徑的 URI;預設值為"ftp://ftp.freebsd.org"
)下載軟體包(按偏好)。
一種簡單的方法是使用一台電腦來建置/快取將安裝在另一台電腦上的套件。
- 您可以從 ports 樹
make package
中的 port 目錄中建立軟體包(這也將安裝 port)。 - 您可以使用
portupgrade
升級一台機器並快取軟體包檔案以在其他機器上使用,上述命令會將軟體包檔案緩存在預設目錄中(請參閱上文)。 - 您可以使用 portupgrade 僅獲取軟體包,而不使用
portupgrade -aPPF
或來安裝它們portupgrade -RPPF [category/port]
。
取得快取的套件檔案後,您可以透過 NFS、FTP、HTTP 等共用該目錄;只要這些文件可以從其他機器存取。使用適當的值設定PACKAGES
或PKG_SITE
以指向快取伺服器。執行典型的portupgrade
命令,它應該從快取伺服器中提取軟體包並安裝它們。
注意:所有伺服器上的連接埠樹必須是最新的才能portupgrade
正確運作(它將嘗試更新到本機連接埠樹中的任何版本)。如果您要在所有電腦上安裝相同的連接埠/軟體包,那麼共用一個伺服器/usr/ports
目錄(例如透過 NFS)並將其安裝在所有其他伺服器上可能是最簡單的方法。
答案2
也許pkg_replace
正是您正在尋找的。
我現在用它戒菸一段時間了。我的一台 FreeBSD 機器充當建置伺服器並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