使用 pkg_add 處理 FreeBSD 軟體包升級
我正在嘗試使用 FreeBSD 的
pkg_add
命令在 build-once-install-on-multiple-machines 場景中安裝和升級二進制包。安裝新軟體包時效果很好,但升級讓我感到困惑。例如,如果我想升級另一個包所依賴的包,我不能只安裝它:# 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
我該如何優雅地處理這個問題(其中“優雅地”意味著“以一種保留依賴資訊而不需要我重建/重新安裝和整個依賴鏈的方式”)。
謝謝!
正如您所發現的,
pkg_add
無法優雅地升級埠。然而,這個portupgrade
包做得很好,並且是我使用和推薦的方法(如果你不喜歡這種方法,還有其他可用的方法)。安裝埠後,您可以簡單地執行
portupgrade -aPP
,它將使用軟體包升級系統上安裝的所有埠。如果您不想更新任何埠,則可以執行portupgrade -RPP [category/port]
以升級特定埠及其所依賴的埠。執行不帶參數的程序將升級屬於目前目錄的埠(cd /usr/ports/security/openssl ; portupgrade
即將升級openssl
,沒有-PP
選項它將從源建構埠);如果您不在埠目錄中,它將顯示幫助(與-h
選項相同)。編輯:
預設情況下,如果包存在於
PKG_PATH
環境變數定義的目錄中,portupgrade 將安裝包(預設為$PACKAGES/All
,$PACKAGES
預設為$PORTSDIR/packages
;因此預設路徑為/usr/ports/packages/All
)。如果它們在那裡不存在,它將(根據偏好)從
$PKG_SITES
(獲取帶有子文件夾的 URILatest
並且All
沒有預設值)或$PACKAGEROOT
(獲取帶有正常鏡像路徑的 URI;預設為"ftp://ftp.freebsd.org"
)下載包。一種簡單的方法是使用一台機器建構/記憶體將安裝在另一台機器上的包。
make package
您可以在埠目錄(也將安裝埠)中從埠樹建構包。- 您可以使用
portupgrade
升級一台機器並記憶體封包件以在其他機器上使用,上述命令會將封包件記憶體在預設目錄中(見上文)。- 您可以使用 portupgrade 僅獲取軟體包,而不是使用
portupgrade -aPPF
或安裝它們portupgrade -RPPF [category/port]
。一旦你有了記憶體的封包件,你就可以通過 NFS、FTP、HTTP 等共享目錄;只要文件可以從其他機器訪問。使用適當的值設置
PACKAGES
orPKG_SITE
以指向記憶體伺服器。執行典型的portupgrade
命令,它應該從記憶體伺服器中提取包並安裝它們。注意:埠樹必須在所有伺服器上都是最新的
portupgrade
才能正確執行(它將嘗試更新到本地埠樹中的任何版本)。如果您要在所有電腦上安裝相同的埠/軟體包,共享一個伺服器/usr/ports
目錄(例如通過 NFS)並將其安裝在所有其他伺服器上可能是最簡單的。