也许最知名的方式 Fedora 社区追求其 促进自由和开源软件和内容的使命 是通过开发 Fedora 软件分发. 因此,我们很大一部分社区资源都花在了这项任务上,这并不奇怪。 这篇文章总结了这个软件是如何“打包”的,以及使这一切成为可能的底层工具,如 rpm。
RPM:软件的最小单位
版本和口味(旋转/实验室/银蓝色) 用户可以从中选择的所有内容都非常相似。 它们都由各种软件组成,这些软件混合在一起可以很好地协同工作。 它们之间的不同之处在于每个工具的确切列表。 该选择取决于他们针对的用例。 所有这些的基本单元是一个 RPM 包文件。
RPM 文件是类似于 ZIP 文件或 tarball 的归档文件。 事实上,他们使用压缩来减小存档的大小。 但是,与文件一起,RPM 存档还包含有关包的元数据。 这可以使用 rpm 工具查询:
$ rpm -q fpaste
fpaste-0.3.9.2-2.fc30.noarch
$ rpm -qi fpaste
Name : fpaste
Version : 0.3.9.2
Release : 2.fc30
Architecture: noarch
Install Date: Tue 26 Mar 2019 08:49:10 GMT
Group : Unspecified
Size : 64144
License : GPLv3+
Signature : RSA/SHA256, Thu 07 Feb 2019 15:46:11 GMT, Key ID ef3c111fcfc659b9
Source RPM : fpaste-0.3.9.2-2.fc30.src.rpm
Build Date : Thu 31 Jan 2019 20:06:01 GMT
Build Host : buildhw-07.phx2.fedoraproject.org
Relocations : (not relocatable)
Packager : Fedora Project
Vendor : Fedora Project
URL : https://pagure.io/fpaste
Bug URL : https://bugz.fedoraproject.org/fpaste
Summary : A simple tool for pasting info onto sticky notes instances
Description :
It is often useful to be able to easily paste text to the Fedora
Pastebin at https://paste.fedoraproject.org and this simple script
will do that and return the resulting URL so that people may
examine the output. This can hopefully help folks who are for
some reason stuck without X, working remotely, or any other
reason they may be unable to paste something into the pastebin
$ rpm -ql fpaste
/usr/bin/fpaste
/usr/share/doc/fpaste
/usr/share/doc/fpaste/README.rst
/usr/share/doc/fpaste/TODO
/usr/share/licenses/fpaste
/usr/share/licenses/fpaste/COPYING
/usr/share/man/man1/fpaste.1.gz
安装 RPM 软件包时,rpm 工具确切地知道哪些文件被添加到系统中。 因此,删除包也会删除这些文件,并使系统保持一致状态。 这就是为什么尽可能选择使用 rpm 安装软件而不是从源代码安装软件的原因。
依赖项
如今,完全独立的软件已经很少见了。 甚至 fpaste,一个简单的单文件 Python 脚本,需要安装 Python 解释器。 因此,如果系统没有安装 Python(极不可能,但可能),则无法使用 fpaste。 在打包行话中,我们说“Python 是 运行时依赖 fpaste“。
构建 RPM 包时(本文不讨论构建 RPM 的过程),生成的存档包含所有这些元数据。 这样,与 RPM 包存档交互的工具知道必须安装其他什么才能使 fpaste 正常工作:
$ rpm -q --requires fpaste
/usr/bin/python3
python3
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(PayloadIsXz) <= 5.2-1
$ rpm -q --provides fpaste
fpaste = 0.3.9.2-2.fc30
$ rpm -qi python3
Name : python3
Version : 3.7.3
Release : 3.fc30
Architecture: x86_64
Install Date: Thu 16 May 2019 18:51:41 BST
Group : Unspecified
Size : 46139
License : Python
Signature : RSA/SHA256, Sat 11 May 2019 17:02:44 BST, Key ID ef3c111fcfc659b9
Source RPM : python3-3.7.3-3.fc30.src.rpm
Build Date : Sat 11 May 2019 01:47:35 BST
Build Host : buildhw-05.phx2.fedoraproject.org
Relocations : (not relocatable)
Packager : Fedora Project
Vendor : Fedora Project
URL : https://www.python.org/
Bug URL : https://bugz.fedoraproject.org/python3
Summary : Interpreter of the Python programming language
Description :
Python is an accessible, high-level, dynamically typed, interpreted programming
language, designed with an emphasis on code readability.
It includes an extensive standard library, and has a vast ecosystem of
third-party libraries.
The python3 package provides the "python3" executable: the reference
interpreter for the Python language, version 3.
The majority of its standard library is provided in the python3-libs package,
which should be installed automatically along with python3.
The remaining parts of the Python standard library are broken out into the
python3-tkinter and python3-test packages, which may need to be installed
separately.
Documentation for Python is provided in the python3-docs package.
Packages containing additional libraries for Python are generally named with
the "python3-" prefix.
$ rpm -q --provides python3
python(abi) = 3.7
python3 = 3.7.3-3.fc30
python3(x86-64) = 3.7.3-3.fc30
python3.7 = 3.7.3-3.fc30
python37 = 3.7.3-3.fc30
解决 RPM 依赖项
虽然 rpm 知道每个存档所需的依赖关系,但它不知道在哪里可以找到它们。 这是设计使然:rpm 仅适用于本地文件,并且必须准确告知它们在哪里。 因此,如果您尝试安装单个 RPM 包,如果 rpm 无法找到该包的运行时依赖项,则会收到错误消息。 这 example 尝试安装从 Fedora 套装套装:
$ ls
python3-elephant-0.6.2-3.fc30.noarch.rpm
$ rpm -qpi python3-elephant-0.6.2-3.fc30.noarch.rpm
Name : python3-elephant
Version : 0.6.2
Release : 3.fc30
Architecture: noarch
Install Date: (not installed)
Group : Unspecified
Size : 2574456
License : BSD
Signature : (none)
Source RPM : python-elephant-0.6.2-3.fc30.src.rpm
Build Date : Fri 14 Jun 2019 17:23:48 BST
Build Host : buildhw-02.phx2.fedoraproject.org
Relocations : (not relocatable)
Packager : Fedora Project
Vendor : Fedora Project
URL : https://neuralensemble.org/elephant
Bug URL : https://bugz.fedoraproject.org/python-elephant
Summary : Elephant is a package for analysis of electrophysiology data in Python
Description :
Elephant - Electrophysiology Analysis Toolkit Elephant is a package for the
analysis of neurophysiology data, based on Neo.
$ rpm -qp --requires python3-elephant-0.6.2-3.fc30.noarch.rpm
python(abi) = 3.7
python3.7dist(neo) >= 0.7.1
python3.7dist(numpy) >= 1.8.2
python3.7dist(quantities) >= 0.10.1
python3.7dist(scipy) >= 0.14.0
python3.7dist(six) >= 1.10.0
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PartialHardlinkSets) <= 4.0.4-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(PayloadIsXz) <= 5.2-1
$ sudo rpm -i ./python3-elephant-0.6.2-3.fc30.noarch.rpm
error: Failed dependencies:
python3.7dist(neo) >= 0.7.1 is needed by python3-elephant-0.6.2-3.fc30.noarch
python3.7dist(quantities) >= 0.10.1 is needed by python3-elephant-0.6.2-3.fc30.noarch
理论上,可以下载 python3-elephant 所需的所有包,并告诉 rpm 它们都在哪里,但这并不方便。 如果 python3-neo 和 python3-quantities 有其他运行时要求等等怎么办? 很快, 依赖链 会变得相当复杂。
存储库
幸运的是,dnf 和朋友们可以帮助解决这个问题。 与 rpm 不同,dnf 知道 存储库. 存储库是包的集合,其元数据告诉 dnf 这些存储库包含什么。 全部 Fedora 系统自带默认 Fedora 默认启用的存储库:
$ sudo dnf repolist
repo id repo name status
fedora Fedora 30 - x86_64 56,582
fedora-modular Fedora Modular 30 - x86_64 135
updates Fedora 30 - x86_64 - Updates 8,573
updates-modular Fedora Modular 30 - x86_64 - Updates 138
updates-testing Fedora 30 - x86_64 - Test Updates 8,458
还有更多信息 这些存储库,以及他们如何 可以管理 在 Fedora 快速文档。
dnf 可用于查询存储库以获取有关它们包含的包的信息。 它还可以在它们中搜索软件,或从中安装/卸载/升级软件包:
$ sudo dnf search elephant
Last metadata expiration check: 0:05:21 ago on Sun 23 Jun 2019 14:33:38 BST.
============================================================================== Name & Summary Matched: elephant ==============================================================================
python3-elephant.noarch : Elephant is a package for analysis of electrophysiology data in Python
python3-elephant.noarch : Elephant is a package for analysis of electrophysiology data in Python
$ sudo dnf list *elephant*
Last metadata expiration check: 0:05:26 ago on Sun 23 Jun 2019 14:33:38 BST.
Available Packages
python3-elephant.noarch 0.6.2-3.fc30 updates-testing
python3-elephant.noarch 0.6.2-3.fc30 updates
安装依赖项
现在使用 dnf 安装包时,它会解析所有必需的依赖项,然后调用 rpm 执行事务:
$ sudo dnf install python3-elephant
Last metadata expiration check: 0:06:17 ago on Sun 23 Jun 2019 14:33:38 BST.
Dependencies resolved.
==============================================================================================================================================================================================
Package Architecture Version Repository Size
==============================================================================================================================================================================================
Installing:
python3-elephant noarch 0.6.2-3.fc30 updates-testing 456 k
Installing dependencies:
python3-neo noarch 0.8.0-0.1.20190215git49b6041.fc30 fedora 753 k
python3-quantities noarch 0.12.2-4.fc30 fedora 163 k
Installing weak dependencies:
python3-igor noarch 0.3-5.20150408git2c2a79d.fc30 fedora 63 k
Transaction Summary
==============================================================================================================================================================================================
Install 4 Packages
Total download size: 1.4 M
Installed size: 7.0 M
Is this ok [y/N]: y
Downloading Packages:
(1/4): python3-igor-0.3-5.20150408git2c2a79d.fc30.noarch.rpm 222 kB/s | 63 kB 00:00
(2/4): python3-elephant-0.6.2-3.fc30.noarch.rpm 681 kB/s | 456 kB 00:00
(3/4): python3-quantities-0.12.2-4.fc30.noarch.rpm 421 kB/s | 163 kB 00:00
(4/4): python3-neo-0.8.0-0.1.20190215git49b6041.fc30.noarch.rpm 840 kB/s | 753 kB 00:00
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 884 kB/s | 1.4 MB 00:01
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : python3-quantities-0.12.2-4.fc30.noarch 1/4
Installing : python3-igor-0.3-5.20150408git2c2a79d.fc30.noarch 2/4
Installing : python3-neo-0.8.0-0.1.20190215git49b6041.fc30.noarch 3/4
Installing : python3-elephant-0.6.2-3.fc30.noarch 4/4
Running scriptlet: python3-elephant-0.6.2-3.fc30.noarch 4/4
Verifying : python3-elephant-0.6.2-3.fc30.noarch 1/4
Verifying : python3-igor-0.3-5.20150408git2c2a79d.fc30.noarch 2/4
Verifying : python3-neo-0.8.0-0.1.20190215git49b6041.fc30.noarch 3/4
Verifying : python3-quantities-0.12.2-4.fc30.noarch 4/4
Installed:
python3-elephant-0.6.2-3.fc30.noarch python3-igor-0.3-5.20150408git2c2a79d.fc30.noarch python3-neo-0.8.0-0.1.20190215git49b6041.fc30.noarch python3-quantities-0.12.2-4.fc30.noarch
Complete!
注意 dnf 甚至是如何安装 python3-igor 的,它不是 python3-elephant 的直接依赖项。
DnfDragora:DNF 的图形界面
虽然技术用户可能会发现 dnf 易于使用,但它并不适合所有人。 龙葵 通过为 dnf 提供图形前端来解决这个问题。
快速浏览一下,dnfdragora 似乎提供了 dnf 的所有主要功能。
里面还有其他工具 Fedora 也管理包。 GNOME Software 和 Discover 是两个例子。 GNOME 软件只专注于图形应用程序。 您不能使用图形前端来安装命令行或终端工具,例如 htop 或 weechat。 但是,GNOME Software 确实支持安装 dnf 不支持的 Flatpaks 和 Snap 应用程序。 因此,它们是具有不同目标受众的不同工具,因此提供了不同的功能。
这篇文章只触及了软件生命周期的冰山一角 Fedora. 本文解释了什么是 RPM 包,以及使用 rpm 和使用 dnf 的主要区别。
在以后的帖子中,我们将更多地谈论:
- 创建这些包所需的过程
- 社区如何测试它们以确保它们正确构建
- 社区用来在未来的帖子中将它们传递给社区用户的基础设施。