debian/control中的包关系

软件包依赖就是软件包关系的一种,一般用 Depends 表示。

每个软件包都可以和其他软件包有各种不同的关系。除 Depends 外,还有 Recommends、Suggests、Pre-Depends、Breaks、Conflicts、Provides 和 Replaces,软件包管理工具(如 apt-get、aptitude、dpkg)在安装、升级或删除软件包时,会依据这些关系采取适当的操作,以确保系统的稳定性和一致性。

1 软件包关系说明

Depends

  • 定义:此软件包仅当它依赖的软件包均已安装后才可以安装。
  • 用途:指定的软件包是程序所必须的软件包,如果缺少这些依赖,程序将无法正常运行或存在严重问题。

Recommends

  • 定义:推荐安装的软件包,但不是严格必须的。
  • 用途 :这些软件包可以增强程序功能。aptitudeapt-get 会在安装你的软件包时自动安装推荐的软件包,用户可以选择禁用这个行为。dpkg 会忽略此项。

Suggests

  • 定义:建议安装的软件包,不是必须的。
  • 用途 :这些软件包可以与程序更好地协同工作,但不是必须的。所有前端程序通常不会询问是否安装建议的软件包。aptitude 可以配置为自动安装建议的软件包,但默认不会这样做。dpkgapt-get 会忽略此项。

Pre-Depends

  • 定义 :此项中的依赖相比于 Depends 重要程度更高,仅在预依赖的软件包已安装并正确配置后,才能安装此软件包
  • 用途:指定的软件包是程序安装前必须安装和配置完成的。应非常慎重使用,建议尽量避免使用此项。

Breaks

  • 定义:当前软件包安装后,会破坏列出的软件包。
  • 用途 :通常 Breaks 会附带一个版本号说明,表示版本低于某个特定值的软件包会被破坏。软件包管理工具会选择升级这些被破坏的软件包作为解决方案。

Provides

  • 定义:声明当前软件包提供了某个已存在的虚拟软件包的功能。
  • 用途:用于某些类型的软件包定义多个备用虚拟名称。

Replaces

  • 定义:当当前软件包要替换其他软件包的某些文件,或完全替换另一个软件包时使用。
  • 用途 :列出将被替换的软件包。通常与 Conflicts 一起使用,以确保被替换的软件包中的文件会被当前软件包中的文件覆盖。

这有助于开发者正确填写软件包关系项,确保软件包能在用户的系统上正常安装和运行。

2 依赖项填写规范

debian/control 文件是 Debian 软件包的元数据文件,包含了关于包的各种信息,包括包名、版本、维护者、依赖关系等。

所有的软件包关系都定义在在 debian/control 文件中,其中 Depends 字段主要负责控制软件包的依赖关系,用于声明软件包的直接依赖。

以下是一个 control 示例:

bash 复制代码
Source: example-package-kylin
Section: web
Priority: optional
Maintainer: Example Maintainer <maintainer@kylinos.cn>
Build-Depends: debhelper (>= 11), dh-systemd (>= 1.5)
Standards-Version: 4.1.4
Homepage: https://www.kylinos.cn/
 
Package: example-package-kylin
Architecture: any
Depends: libwebp6 (>= 0.6.1), libc6 (>> 2.27), python3 | python3-minimal, ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends}
Description: An example package for Kylin systems
 This package provides an example service with web capabilities.
 It relies on several other packages to function properly, including
 essential libraries and optional Python support.

Depends 字段填写指导

1. 确定必需依赖包:列出在安装或运行软件包时必须存在的其他软件包。这些是绝对必要的依赖包。如果缺少其中任何一个,软件包将无法正常工作。

2. 格式Depends 字段的格式为逗号分隔的依赖项列表。每个依赖项可以指定包名和可选的版本约束。例如:

Depends: libwebp6 (>= 0.6.1), libc6 (>> 2.27)

3. 版本约束:可以使用版本约束来指定依赖包的最低、最高或特定版本。常用的版本约束符号包括:

  1. >= 表示大于或等于
  2. <= 表示小于或等于
  3. = 表示等于
  4. >> 表示严格大于
  5. << 表示严格小于

4. 逻辑运算符 :可以使用逻辑运算符来指定依赖关系的选择。例如,使用竖线 | 表示逻辑 "或" 关系,表示多个包中的一个即可满足依赖关系:

Depends: python3 | python3-minimal

5. 虚拟包:如果依赖项是一个虚拟包,确保列出的包提供了该虚拟包。例如:

Depends: mail-transport-agent

注释:在麒麟系统中,虚拟包是一个抽象的包概念,它本身不直接对应任何实际的软件包,而是由一个或多个实际的软件包提供相应的功能。虚拟包用来表示一组可以互换的软件包的功能。

示例:mail-transport-agent

  1. 定义:mail-transport-agent(MTA)是一个虚拟包,它代表了一个邮件传输代理的功能,这是用于在网络上发送和接收电子邮件的软件。
  2. 提供者:多个包如 exim4-daemon-light, postfix, sendmail 等都可以提供 mail-transport-agent 虚拟包。这意味着这些软件都具备邮件传输代理的功能。
  3. 实现方式:安装此软件包时,麒麟系统的包管理系统会检查系统中是否已安装提供 mail-transport-agent 虚拟包的软件包。如果没有,系统会提示用户安装一个提供该虚拟包的软件包。用户可以选择安装 exim4, postfix, sendmail 或任何其他提供此虚拟包的软件。

这种方式确保软件包能够适应用户的不同选择,而不是硬编码对某个特定软件包的依赖,提高了包的通用性和灵活性。

6. 自动依赖 :当软件包依赖于某些共享库或其他资源时,这些依赖可能需要通过特殊的变量(例如: ${shlibs:Depends} , ${misc:Depends}${perl:Depends} )来自动生成,以确保软件包能够正确地链接到所需的库。

Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends}

以上填写规范中,尤其需要注意自动依赖 的填写,后续会针对自动依赖做说明

3 自动依赖

在软件包的构建过程中,自动依赖变量 {shlibs:Depends}、{perl:Depends} 和 ${misc:Depends} 的使用大大简化了依赖管理工作。这些变量在软件包的编译过程中,通过 debhelper 工具自动替换为具体的依赖包列表,确保软件包在运行时所需的所有库和组件都会被正确安装。

${shlibs:Depends}

用途:自动添加由共享库引起的依赖,主要针对依赖特定版本动态链接库的 C 和 C++ 程序。

原理:dpkg-shlibdeps 工具在构建过程中扫描当前编译的软件包所生成的可执行文件和动态库,分析它们所依赖的共享库,并根据编译环境中提供的 /var/lib/dpkg/info/*.symbols 或 *.shlibs 文件确定所需的包及其版本要求,自动将这些依赖添加到 Depends 字段。

  • 共享库扫描:dpkg-shlibdeps 工具会扫描软件包中的二进制文件,确定其所链接的共享库以及使用的符号。
  • 符号文件:/var/lib/dpkg/info/*.symbols 文件包含了共享库的符号信息,用于精确确定依赖关系。开发者应当维护好这些符号文件,以确保依赖关系的准确性。
  • 版本控制:基于符号文件,dpkg-shlibdeps 会为每个依赖库生成准确的版本需求,避免由于库版本不匹配导致的运行时错误。

${perl:Depends}

用途:自动包括 Perl 脚本或模块所需的 Perl 版本和其他模块依赖。

原理:dh_perl 工具分析 Perl 程序的用法,自动识别并添加所需的 Perl 版本和 CPAN 模块依赖。

  • Perl 版本:dh_perl 工具能够识别所需的 Perl 版本,并将其添加到依赖列表中。
  • 模块依赖:对于使用 CPAN 模块的脚本,dh_perl 会自动添加这些模块的依赖,确保在安装包时,这些模块也会一并安装。

${misc:Depends}

用途:包含难以归类的杂项依赖。

原理:如果你的软件包需要一些特殊的工具或脚本来安装,而这些工具和脚本的依赖项不属于共享库或 Perl 模块,那么这些依赖项会被 ${misc:Depends} 自动添加。

  • 杂项依赖:对于那些不属于共享库或 Perl 模块的依赖项,misc:Depends 可以确保它们也会被正确包含。
  • 举例:假设你在使用 debhelper 工具来帮助安装你的软件包,这些工具可能需要额外的一些依赖项。${misc:Depends} 会自动识别并添加这些依赖,以确保你的软件包能正确安装和运行。
相关推荐
EutoCool6 分钟前
Linux:同步
linux·服务器·c++
赵民勇14 分钟前
debian/control文件中的${shlibs:Depends}
linux·运维·debian
企鹅侠客20 分钟前
开源操作系统纷争:CentOS停服后的新战场
linux·开源·centos
什么半岛铁盒1 小时前
操作系统:计算机架构里的幕后指挥官
linux·c语言·centos·编辑器
心灵宝贝1 小时前
Linux中jdk-8u291-linux-x64 中jdk工具包
java·linux·开发语言
迷雾骑士2 小时前
CentOS 7.6上安装Docker(1)
linux·docker·centos
Htht1112 小时前
【Linux】之【Bug】VMware 虚拟机开机 一直卡在黑屏左上角下划线闪烁界面
linux·运维·bug
溟洵2 小时前
Linux下学【MySQL】表的连接(inner join、left join、right join)(简单试题理解版)
linux·运维·mysql
健康平安的活着2 小时前
性能调优-cpu的性能指标【经典篇】
linux·运维·服务器
努力努力再努力wz2 小时前
【Linux实践系列】:用c语言实现一个shell外壳程序
linux·运维·服务器·c语言·c++·redis