我正在尝试使用 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"
一种简单的方法是使用一台机器来构建/缓存将安装在另一台机器上的包。
make package
您可以从端口目录的端口树中构建软件包(这也将安装该端口)。- 您可以使用
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