openSUSE:软件包冲突
冲突指南
作者:
SUSE 审核: , ,
修订版 0.06
初始草稿: 2006年12月5日 星期二
上次修订: 2009年3月12日 星期四
Conflicts
在尽可能的情况下,openSUSE软件包应避免相互冲突。不幸的是,这并非总是可能的。这些指南说明了如何在openSUSE中处理冲突,特别是何时以及何时不使用Conflicts:字段。
冲突的可接受用途
作为一般规则,openSUSE软件包不得包含任何Conflicts:字段的使用。该字段通常被滥用,而通常使用Requires:会更合适。它会混淆依赖关系求解器和最终用户,而没有任何好处。但是,在某些情况下,使用Conflicts:字段是合适的且可以接受的。
隐式冲突
请记住,隐式冲突绝不被接受。如果您的软件包与另一个软件包冲突,则必须解决冲突,或使用 Conflicts: 标记它。
可选功能
某些软件如果存在其他可选软件应用程序,可以使用它们,但不需要安装它们。如果未安装它们,该软件仍然可以正常运行。但是,如果这些其他“可选应用程序”太旧,则该软件将无法工作。这是Conflicts:字段的可接受用途。打包者必须在Conflicts:字段上方的注释中记录原因
示例
Conflicts: unrar < 2.0
如果软件链接到另一个软件包的库,则必须使用Requires:而不是Conflicts:来标记该依赖关系。此外,如果软件在未安装另一个软件包的情况下无法正常运行,则必须使用Requires:而不是Conflicts:。
打包者应该询问
如果 Conflicts: 中的软件包(正确的版本)不存在,我的软件包是否可以正常运行?
如果答案是肯定的,那么这可能是Conflicts:的有效用途。如果答案是否定的,那么几乎可以肯定的是,使用Requires:更好。
例如,如果 foo-game 需要 libbar 才能运行,但不能与旧于 1.2.3 的 libbar 一起工作
错误: Conflicts: libbar < 1.2.3
正确: Requires: libbar >= 1.2.3
打包者应将 Conflicts: 的使用量降至最低。
兼容包冲突
在某些涉及兼容包的情况下,可以使用Conflicts:是可以接受的。这些情况是无法修补应用程序以查找 -compat 文件的替代位置,因此 foo-devel 和 foo-compat-devel 包需要Conflict:。在可能的情况下,应避免这种情况。
冲突的文件
多种类型的文件可能在多个软件包之间发生冲突。Fedora 强烈建议不要使用Conflicts:来解决这些情况。以下是一些可用于解决这些冲突的建议(请注意,并非所有文件冲突情况都列出,也不是所有可能的解决方案)
Man Page 名称冲突
- 重命名 man 页面以略微更改 man 页面的后缀(例如 man1/check.1.gz 和 man1/check.1foo.gz)
- 重命名 man 页面以包含提供软件包的前缀(例如 foo-check.1.gz 和 bar-check.1.gz)
库名称冲突
- 将库放在 /usr/lib 或 /lib 的子目录中,并在 /etc/ld.so.conf.d/ 中包含一个 ld.so.conf 文件。例如是 mozilla-xulrunner-{181,190} 包。
头文件名称冲突
- 将头文件放在 /usr/include 的子目录中。
二进制文件名称冲突
- 说服上游重命名二进制文件,使其不太通用(或者冲突较少)。
- 在冲突的二进制文件提供相同功能的情况下,您可以重命名二进制文件并添加前缀,并使用“alternatives”让最终用户选择默认的通用名称。请注意,通常不是这种情况。
冲突的其他用途
如果您发现自己处于一种情况,即您认为您的软件包必须与另一个软件包冲突(显式或隐式),但不符合上述记录的可接受情况,请在 opensuse-packaging 邮件列表中提问。如果他们同意,那么,只有在获得同意后,您才能在 openSUSE 包中使用Conflicts:。请记住,每当您使用Conflicts:时,您还需要在Conflicts:条目旁边包含原因,以便清楚地说明为什么需要它。