5.16.解决冲突

有三个不同的变量来注册包和ports之间的冲突: CONFLICTS , CONFLICTS_INSTALL 和 CONFLICTS_BUILD 。

当移除几个冲突的ports之一时,建议在其他ports中保留 CONFLICTS 几个月,以迎合那些偶尔更新一次的用户。

CONFLICTS_INSTALL

如果软件包无法与其他软件包共存(因为文件冲突、运行时不兼容等)。在构建阶段之后、安装阶段之前进行 CONFLICTS_INSTALL 检查。

CONFLICTS_BUILD

如果port在其他特定ports已安装时无法构建。构建冲突不记录在生成的软件包中。

CONFLICTS

如果port在某个特定port已安装的情况下无法构建,并且生成的软件包无法与其他软件包共存。在构建阶段和安装阶段之前进行 CONFLICTS 检查。

CONFLICTS* 变量值中的每个以空格分隔的项目都会与除正在

% make -C devel/git FLAVOR=lite all deinstall install

但是以下命令会报告冲突,因为安装的软件包基本名称是 git-lite ,而 git 将被构建,但不能与 git-lite 一起安装:

% make -C devel/git FLAVOR=default all deinstall install

没有该功能,Makefile 将需要为每个风味列出一个 _flavor__CONFLICTS_INSTALL ,列出每个其他风味。

这些变量中最常见的内容是另一个port的软件包基名。软件包基名是没有附加版本的软件包名称,可以通过运行 make -V PKGBASE 获得。

示例 46. CONFLICTS* 的基本用法

如果 dns/bind910 存在,则无法安装 dns/bind99,因为它们安装相同的文件。首先收集要使用的软件包基础:

% make -C dns/bind99 -V PKGBASE
bind99
% make -C dns/bind910 -V PKGBASE
bind910

然后将其添加到 dns/bind99 的 Makefile 中:

CONFLICTS_INSTALL=	bind910

将内容添加到 dns/bind910 的 Makefile 文件中:

CONFLICTS_INSTALL=	bind99

有时,只有另一个 port 的特定版本是不兼容的。在这种情况下,使用完整的包名称,包括版本号。如有必要,使用 shell 通配符,如 * 和 ? ,以便匹配所有必要的版本。

示例 47. 使用通配符 CONFLICTS* 。

从版本 2.0 及更高版本到 2.4.1_2,deskutils/gnotime 曾经安装一个捆绑版本的 databases/qof。

为了反映这一过去,databases/qof 的 Makefile 包含:

CONFLICTS_INSTALL=	gnotime-2.[0-3]* \
			gnotime-2.4.0* gnotime-2.4.1 \
			gnotime-2.4.1_[12]

第一个条目匹配版本 2.0 到 2.3 ,第二个匹配所有的 2.4.0 版本修订,第三个精确匹配 2.4.1 版本,最后一个匹配 2.4.1 版本的第一和第二个修订。

deskutils/gnotime 没有任何冲突行,因为其当前版本与其他任何东西都不冲突。

当制作不受冲突影响的目标时,可以暂时设置变量 DISABLE_CONFLICTS 。这个变量不能在port Makefiles 中设置。

% make -DDISABLE_CONFLICTS patch

最后更新于

FreeBSD 中文社区 2024