openSUSE:升级依赖解释
如何进行分发升级
有两种更新模式需要不同的行为
- Bugfixes (Patches)
- 发行版升级
在第一种模式下,已安装的软件包会被修补,以修复错误或引入缺失的功能。但是,软件包版本通常保持不变,只有软件包发布号会更改。(如果系统例如是 openSUSE 13.2,它将保持在 openSUSE 13.2)
构建环境(编译器、库等)也只会发生最小的变化。
发行版升级会将整个系统提升到一个新的水平,操作系统版本会增加。(如果系统例如是 openSUSE 13.1,它将升级到 openSUSE 13.2)在发行版升级期间允许的软件包更改更加严重,包括
- 删除的软件包
- 新的软件包
- 重命名的软件包
- 合并的软件包
- 拆分的软件包
这些更改很难(甚至不可能)通过 RPM 依赖关系来表达。因此,需要一种更具表现力的软件包依赖关系形式,以便可以执行系统升级。
此 Wiki 页面记录了如何表达用于发行版升级的依赖关系。
如果您正在添加用于无缝系统升级的依赖关系,请不要忘记指定 openSUSE 版本,这些依赖关系在哪个版本中需要。这将允许在未来版本(很可能是在 openSUSE 版本 + 1 和 SLE 版本 + 2)中将这些行识别为已过时。
表达依赖关系的方式
每个软件包都可以通过定义符号名称来表达对其他软件包的依赖关系提供的功能 (Provides), Requires,和Conflicts.
这些符号名称通常是软件包名称,但也可以是不与软件包相关的“抽象”名称。
这些符号名称可用于表达与特定软件包无关的功能。例如,邮件传输代理 MTA 功能由多个软件包提供。sendmail和postfix是最主要的。
重要的是要记住,所有符号名称(无论是软件包名称还是抽象名称)都位于相同的命名空间中。在选择抽象名称(例如,用于功能)时,它不得与另一个软件包名称冲突。
为了表达更新依赖关系,以便用另一个(较新的)软件包替换一个(旧的)软件包,使用废弃 (Obsoletes)标签。
关于 RPM 依赖关系的事实
- 每个软件包隐式提供其名称。
无需提供软件包名称,但其他软件包可以需要(或与)软件包名称冲突。 - 软件包不能与其提供的符号标签冲突。更确切地说,软件包为符号标签设置的依赖项对其自身没有影响,仅对提供相同标签的其他已安装软件包产生影响。特别是Conflicts" 依赖项,软件包为它提供的符号标签设置,对软件包本身没有影响,只对提供相同标签的其他已安装软件包产生影响。特别是冲突:%{name}" 对于软件包本身将被忽略;它只会导致该软件包与具有相同名称的每个其他已安装软件包发生冲突。(注意:此 Conflicts: 行为是 rpm 4.10 之后的新行为;早期版本行为不同。更多详细信息)。
- 已过时仅适用于真实的软件包名称。
不能废弃符号标签。 - 在Requires, 提供的功能 (Provides),和Conflicts,区分大小写。
基本依赖关系
安装新软件包
| pac.spec | |
|---|---|
| 名称 | pac |
| 版本 | 1.0 |
| Requires | |
| 提供的功能 (Provides) | |
| 废弃 (Obsoletes) | |
| Conflicts |
更新软件包
| pac.spec | |
|---|---|
| 名称 | pac |
| 版本 | 1.1 |
| Requires | |
| 提供的功能 (Provides) | |
| 废弃 (Obsoletes) | |
| Conflicts |
匹配的名称和更高的版本使这成为对pac-1.0
的更新。
| 重命名软件包 | ||
|---|---|---|
| 名称 | package.spec | |
| 版本 | 1.1 | |
| Requires | ||
| 提供的功能 (Provides) | pac = %{version} | |
| 废弃 (Obsoletes) | pac < %{version} | |
| Conflicts |
严格来说,在提供的功能 (Provides)字段中给出旧软件包名称仅在另一个软件包需要旧软件包名称时才需要。请将版本号添加到旧软件包名称的字段中,以便以后可以重新命名。(例如提供:pac = 1.0)。在 90% 的情况下,您可以使用 %{version} 如上例所示。
但是,提供的功能 (Provides)条目会在更新期间触发新软件包的选择。正是此字段告诉,我正在接管旧软件包。废弃 (Obsoletes)只是确保原子替换,以便不会破坏任何依赖关系。版本字段在这里无关紧要,但您也应该将旧软件包版本号添加到废弃 (Obsoletes)字段(在本例中过时:pac <= 1.0)以启用使用更高版本号返回到旧软件包名称的“后退方式”。如示例所示,您也可以在此处使用 %{version}。请确保仅在这种情况下使用“<”,否则您无法在同一版本中恢复到旧名称。
如果子软件包的版本号与主软件包不同,则无法在 Provides/Obsoletes 中使用 %{version}。当然,您可以使用子软件包的版本中的相同版本字符串。
请还在 spec 文件中添加一个简单的注释,例如“#pac上次在 openSUSE 13.2 中使用”。如果没有它,将很难确定何时可以擦除这些行。否则它将永远在那里。
用具有相同功能的另一个软件包替换软件包
| 重命名软件包 | |
|---|---|
| 名称 | package.spec |
| 版本 | 1.1 |
| Requires | |
| 提供的功能 (Provides) | |
| 废弃 (Obsoletes) | pac < %{version} |
| Conflicts |
除了重命名软件包pac将被替换为package.spec虽然package.spec不提供pac的文件。所以package.spec 不提供 pac.
这只有在某个软件包废弃pac 仅限。如果有多个软件包,求解器将不会执行此更新。
拆分和合并
拆分子软件包
| pac.spec | pac-devel.spec | |||
|---|---|---|---|---|
| 名称 | pac | 名称 | pac-devel | |
| 版本 | 1.1 | 版本 | 1.1 | |
| Requires | Requires | |||
| 提供的功能 (Provides) | 提供的功能 (Provides) | pac:/file/from/pac | ||
| 废弃 (Obsoletes) | 废弃 (Obsoletes) | |||
| Conflicts | Conflicts |
将软件包拆分为两个
| firstpac.spec | secondpac.spec | |||
|---|---|---|---|---|
| 名称 | firstpac | 名称 | secondpac | |
| 版本 | 1.1 | 版本 | 1.1 | |
| Requires | Requires | |||
| 提供的功能 (Provides) | pac = 8.15 | 提供的功能 (Provides) | pac:/file/from/pac | |
| 废弃 (Obsoletes) | pac < 8.15 | 废弃 (Obsoletes) | ||
| Conflicts | Conflicts |
显示的示例列出了单独的.spec文件用于pac和pac-devel。(请记住,RPM 允许从单个.spec文件中提供相同的供应商和标识信息。
定义子软件包。)提供的功能 (Provides)依赖关系解析(安装两个新软件包)由 YaST 使用pac-devel.
中提到的split-alias完成。pac和pac-devel软件包维护者决定-devel之间的依赖关系。例如,如果想要将库软件包拆分为主软件包、和软件包定义子软件包。主软件包和和软件包,则主软件包和-devel软件包是独立的,但
软件包需要主软件包。
在更新期间,上述 split-alias 标签非常重要。YaST 仅更新已安装的软件包,在这种情况下仅更新主软件包。如果没有 split-alias,这将删除旧主软件包中包含但新主软件包中没有的开发所需的文件。提供的功能 (Provides)脚本pac给定的pac-devel现在触发此更新依赖关系,因为它告诉 YaST 也安装
如果一个软件包被拆分为多个软件包,则拆分别名标签必须相互排斥。这是 YaST 正确处理此类更新依赖关系的唯一方法。
如果一个软件包拆分为多个软件包,则 split-alias 标签必须互斥。这是 YaST 正确处理此类更新依赖关系的一种方式。
未来的重要增强-devel软件包始终是一个好主意。但并非在所有情况下都有意义 - 因为有时-devel软件包会太小或不包含任何内容。在这种情况下,只需添加一个提供:pac-devel = %{version}在主软件包中可以解决问题:其他软件包可以需要此虚拟-devel软件包。
请还在 spec 文件中添加一个简单的注释,例如“#-devel在 openSUSE 13.2 中拆分”。如果没有它,将很难确定何时可以擦除这些行。否则它将永远在那里。
请还在 spec 文件中添加一个简单的注释,例如“# -devel 在 openSUSE 12.3 中拆分”。如果没有它,将很难决定何时可以删除这些行。否则,它可能会永远保留在那里。
| 重命名软件包 | |
|---|---|
| 名称 | package.spec |
| 版本 | 1.1 |
| Requires | |
| 提供的功能 (Provides) | pac = 8.15 |
| 废弃 (Obsoletes) | pac < 8.15 |
| Conflicts |
这与软件包重命名类似。新软件包还必须包含提供的功能 (Provides)和废弃 (Obsoletes)这与软件包重命名类似。新软件包还必须包含旧软件包的X.
标签。这对于从发行版之前正确更新至关重要。
| 重命名软件包 | |
|---|---|
| 名称 | package.spec |
| 版本 | 1.1 |
| Requires | |
| 提供的功能 (Provides) | pac1 = 8.15 pac2 = 2.3 |
| 废弃 (Obsoletes) | pac1 < 8.15 pac2 < 2.3 |
| Conflicts |
pac1 <= 8.15, pac2 <= 2.3
处理替代方案
| firstpac.spec | secondpac.spec | 不冲突 | |||||
|---|---|---|---|---|---|---|---|
| 名称 | firstpac | 名称 | secondpac | 名称 | thirdpac.spec | ||
| 版本 | 1.0 | 版本 | 1.0 | 版本 | 1.0 | ||
| Requires | Requires | Requires | |||||
| 提供的功能 (Provides) | thirdpac | 提供的功能 (Provides) | thirdpac | 提供的功能 (Provides) | Pac 1.0 | ||
| 废弃 (Obsoletes) | 废弃 (Obsoletes) | 废弃 (Obsoletes) | |||||
| Conflicts | Conflicts | Conflicts |
Pac = 1.0
(Pac 中的大写字母是故意选择的,以将此标签与软件包区分开来。此类功能必须在 openSUSE 社区中达成一致。在发明您自己的标签之前,请在 opensuse-packaging 上提问!)。
示例xdm和kdm提供“Display-Manager”功能
部分冲突
| firstpac.spec | secondpac.spec | 不冲突 | |||||
|---|---|---|---|---|---|---|---|
| 名称 | firstpac | 名称 | secondpac | 名称 | thirdpac.spec | ||
| 版本 | 1.0 | 版本 | 1.0 | 版本 | 1.0 | ||
| Requires | Requires | Requires | |||||
| 提供的功能 (Provides) | thirdpac | 提供的功能 (Provides) | thirdpac | 提供的功能 (Provides) | thirdpac | ||
| 废弃 (Obsoletes) | 废弃 (Obsoletes) | 废弃 (Obsoletes) | |||||
| Conflicts | secondpac | Conflicts | firstpac | Conflicts |
该Conflicts表达只有 firstpac 或 secondpac 才能安装。但不能同时安装。
互斥
| firstpac.spec | secondpac.spec | 不冲突 | |||||
|---|---|---|---|---|---|---|---|
| 名称 | firstpac | 名称 | secondpac | 名称 | thirdpac.spec | ||
| 版本 | 1.0 | 版本 | 1.0 | 版本 | 1.0 | ||
| Requires | Requires | Requires | |||||
| 提供的功能 (Provides) | thirdpac | 提供的功能 (Provides) | thirdpac | 提供的功能 (Provides) | thirdpac | ||
| 废弃 (Obsoletes) | 废弃 (Obsoletes) | 废弃 (Obsoletes) | |||||
| Conflicts | secondpac thirdpac | Conflicts | firstpac thirdpac | Conflicts | firstpac secondpac |
只能安装 firstpac、secondpac 或 thirdpac 中的一个。









