我正在尝试使用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
我如何优雅地处理这个问题(“优雅”意思是“以保留依赖信息的方式,而不需要我重build/重新安装整个依赖链”)。
谢谢!
如您pkg_add , pkg_add无法正常升级端口。 portupgrade包很好地做到了这一点,而且是我使用和推荐的方法(如果你不喜欢这个方法,还有其他的可用的)。
一旦端口被安装,你可以简单地运行portupgrade -aPP ,它将使用软件包升级系统上安装的所有端口。 如果您不想更新端口,则可以运行portupgrade -RPP [category/port]来升级特定的端口及其所依赖的端口。 运行不带参数的程序将升级属于当前目录的端口(即cd /usr/ports/security/openssl ; portupgrade将升级openssl ,没有-PP选项,它将从源端build立端口)。 如果您不在端口目录中,它将显示帮助(与-h选项相同)。
编辑:
默认情况下,portupgrade会在PKG_PATH环境variables(默认为$PACKAGES/All , $PACKAGES默认为$PORTSDIR/packages ;因此默认path为/usr/ports/packages/All )所在的目录下安装包。
如果它们不存在,它将从$PKG_SITES (采用子文件夹Latest和All ;没有默认值)或$PACKAGEROOT (采用一个具有正常镜像path的URI;默认是"ftp://ftp.freebsd.org" )。
一个简单的方法来做到这一点,使用一台机器来build立/caching将安装在其他机器上的软件包。
make package在ports目录下(也将安装端口)从ports树中构build软件包。 portupgrade升级一台机器并caching这些包文件以供其他机器使用,上述命令会将包文件caching在默认目录中(请参阅上文)。 portupgrade -aPPF或portupgrade -RPPF [category/port]来获取软件包。 一旦你有了caching的包文件,你可以通过NFS,FTP,HTTP等共享目录; 只要文件可以从其他机器访问。 将PACKAGES或PKG_SITE设置为适当的值以指向高速caching服务器。 执行典型的portupgrade命令,它应该从caching服务器中提取软件包并进行安装。
注意:端口树必须在所有服务器上保持最新,才能使portupgrade正常运行(它将尝试更新到本地端口树中的任何版本)。 如果你打算在所有计算机上安装相同的端口/软件包,那么共享一个服务器/usr/ports目录(比如通过NFS)最容易,并将其安装在所有其他服务器上。
也许pkg_replace是你在找什么。
我现在用了一段时间退出。 我的一台FreeBSD机器用作构build服务器,并为其他机器构build(使用portmaster )所有软件包。 我使用pkg_replace在所有其他机器上安装这些预build包。
http://www.FreeBSD.org/cgi/url.cgi?ports/ports-mgmt/pkg_replace/pkg-descr
或者你可以依靠Portsnap或CVSup,这里描述:
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/ports-using.html