这个问题比较难描述,我们来看一个例子:
该软件包blender
依赖于blender-data
。我查看了这两个软件包。blender
仅包含应用程序、.desktop 文件和类似内容,同时blender-data
还包含应用程序图标等。如果我从原始网站下载 blender,则不会获得任何软件包,而会获得一个包含我需要的所有内容的文件夹。
为什么 Blender 有数据包?还有更多这样的约定吗?有哪些类型的包?我在哪里可以阅读更多相关信息?我找到了很多关于如何打包和内部细节的信息,但没有关于命名约定和创建*-data
包的原因的信息。
答案1
为了回答你的问题,我将使用自由办公室作为示例(因为几乎每个人都安装了它)。如果你使用的是 Lubuntu(它没有 LibreOffice 作为标准办公套件),并且安装了 LibreOffice,那么它就是包裹几乎是空的尽管它软件包依赖项适用于 Writer、Calc、Base 等。
软件包依赖关系只是指向另一个软件包的“指针”。否则,Canonical(Ubuntu 背后的公司)的服务器很快就会被两倍、三倍、四倍……包含相同文件的软件包填满!
一个包本身仅有的包含这样的“指针”被称为元包。
因此,LibreOffice 元软件包会拉入其单独的软件包(例如calc
),这些软件包会拉入其依赖项,这些依赖项又会拉入它们的依赖项,直到所有依赖项都得到解决。
您能但是只安装 Calc 没有任何其他包裹。
要查看实际效果,请在终端中输入以下命令:
apt-cache depends libreoffice-calc
这blender
只是上述的一个非常简单的例子。
更多细节:
对于某些包,内容被分解为功能单元:常见的有以下包:应用程序、应用程序数据、应用程序插件、应用程序开发,以及其他一些包,它们分别包含应用程序本身、要操作的数据集或数据、一些插件或其他任何东西……
完整详情请见:
访问包管理开发维基。
答案2
除了 Fabby 的回答之外,还有一点需要考虑:包内容的架构依赖性。
例如,blender
程序本身显然取决于操作系统的架构 - 您只能amd64
在操作系统上运行二进制文件amd64
。但是,很多数据并不那么依赖 - 例如,图标文件、翻译、用 Python 或 Java 等语言编写的程序对于所有架构来说都可以是相同的。
因此,优化软件包内容的第一步是将这些文件拆分为依赖特定架构版本的通用软件包。通用文件通常位于具有-data
架构的软件包中all
。二进制和库软件包的架构值为amd64
、i386
、armhf
等。
这实际上是包装最佳实践Debian 推荐:
程序打包了大量与架构无关的数据,这种情况并不罕见。例如,音频文件、图标集合、壁纸图案或其他图形文件。如果这些数据的大小与程序包其余部分的大小相比可以忽略不计,那么最好将它们全部放在一个程序包中。
但是,如果数据量很大,请考虑将其拆分成一个单独的、与体系结构无关的包 (
_all.deb
)。通过这样做,您可以避免将相同的数据不必要地复制到 11 个或更多 .deb 中,每个体系结构一个。虽然这会增加一些额外的文件开销Packages
,但它可以节省 Debian 镜像上的大量磁盘空间。分离出与体系结构无关的数据还可以减少 lintian 的处理时间(请参阅第 A.2 节 “软件包 lint 工具”) 在整个 Debian 档案库上运行时。
这种与体系结构无关的文件经常进入/usr/share
- 事实上,在该目录树中拥有与体系结构相关的文件是违反策略的。
然后自然而然地就会出现一种组织事物的方式:
all
├── doc # man pages, documentation in other formats
├── icons
├── themes
├── translations
└── etc.
arch
├── bin # binaries
├── dbg # binaries with debug symbols
├── lib # shared library files
└── lib-dev # header files and other shared library files for development