9 个版本

0.17.0 2023年11月3日
0.16.0 2023年4月8日
0.15.0 2022年8月7日
0.14.0 2022年6月5日
0.8.0 2021年12月13日

#376Unix API

27 每月下载量
用于 2 crates

MPL-2.0 许可证

410KB
8K SLoC

debian-packaging

debian-packaging 是一个库crate,实现了与 Debian 打包相关的功能。以下功能已(部分)实现:

  • 解析和序列化控制文件
  • 解析 ReleaseInRelease 文件。
  • 解析 Packages 文件。
  • 从 HTTP 服务器获取 Debian 仓库文件。
  • 编写变更日志文件。
  • 读取和写入 .deb 文件。
  • 创建仓库。
  • PGP 签名和验证操作。

请参阅 crate 的文档以获取更多信息。


lib.rs:

Debian 打包原语。

此 crate 定义了 Debian 打包原语的纯 Rust 实现。Debian 打包(通常与 aptapt-get 等工具交互)为 Debian 和 Ubuntu 等基于 Debian 的 Linux 发行版的打包提供了基础。

目标

合规性和兼容性

我们希望此 crate 与现场 Debian 打包部署尽可能兼容,以便可以作为实现消耗和生成与官方 Debian 打包实现兼容的实体的工具的基础。

此 crate 可以被认为是尝试在纯 Rust 中重新实现 apt 的方面。(apt 仓库定义了像 apt-get 这样的命令行工具以及像 libapt-pkglibapt-inst 这样的库。此 crate 更侧重于提供库级别的接口。然而,目标是让尽可能多的代码可以作为库使用,因此工具的表面区域最小。)

确定性和可重现性

为了帮助应对软件供应链攻击的兴起并使调试和测试更容易,此 crate 的一个目标是尽可能确定性和可重现。

给定相同的源代码 / 此 crate 的版本,创建 .deb 文件或从索引的 .deb 文件构建仓库的操作应尽可能与可合理实现的字节数完全相同。

性能

我们在可能的情况下,努力实现打包原语的最高优化。

我们希望促进密集型操作(如读取Debian存储库中的所有包)或发布到存储库,以扩展到尽可能多的CPU核心。

读取操作,如解析控制文件或版本字符串,应能够使用0拷贝来避免过度的内存分配和复制。

功能概览

.deb文件定义了Debian包。在[deb]模块中存在.deb文件的读取器和写入器。要读取定义二进制包的.deb文件的内容,请使用deb::reader::BinaryPackageReader。要创建新的.deb文件,请使用deb::builder::DebBuilder

Debian打包中的常见原语是控制文件。这些由键值元数据的段落组成。低级控制文件原语定义在[control]模块中。control::ControlParagraph定义了一个段落,它由control::ControlField组成。control::ControlFile提供了一个控制文件的接口,该文件由多个段落组成。control::ControlParagraphReader实现控制文件的流式读取器,而control::ControlParagraphAsyncReader实现异步流式读取器。

Debian打包中有不同种类的控制文件binary_package_control::BinaryPackageControlFile定义了二进制包的控制文件。此类型提供了为二进制控制文件上的常见字段解决辅助函数。debian_source_control::DebianSourceControlFile定义了源包的控制文件,如.dsc文件中所述。

存在一种元语言用于表示Debian包之间的依赖关系。[dependency]模块定义了解析和写入此语言的类型。例如,dependency::DependencyList表示解析后的依赖关系列表,如libc6 (>= 2.4), libx11-6dependency::PackageDependencyFields表示定义包之间关系的控制字段的集合。

[package_version]模块实现了Debian包版本字符串的解析、序列化和比较。package_version::PackageVersion是用于此的主要类型。

[dependency_resolution]模块实现了与解决依赖相关的功能。例如,dependency_resolution::DependencyResolver可用于索引已知的二进制包并找到直接和间接依赖。这可以作为包管理器或其他工具的基础,该工具希望遍历给定包的依赖树。

该[仓库]模块提供了与Debian仓库相关的功能,Debian仓库是Debian软件包和元数据的发布。trait repository::RepositoryRootReader 为读取仓库的根目录提供了一个接口,而 repository::ReleaseReader 提供了一个接口来读取已解析的 [In]Release 文件的内容。trait repository::RepositoryWriter 抽象化了写入仓库的I/O操作。仓库交互涉及许多支持原语。repository::release::ReleaseFile 表示一个 [In]Release 文件。提供了验证PGP签名的支持。repository::contents::ContentsFile 表示一个 Contents 文件。

存在具体的仓库交互实现。repository::http::HttpRepositoryClient 允许从HTTP托管仓库(例如 http://archive.canonical.com/ubuntu)读取。repository::filesystem::FilesystemRepositoryWriter 允许将仓库写入本地文件系统。

模块 repository::builder 包含创建和发布Debian仓库的功能。repository::builder::RepositoryBuilder 是发布Debian仓库的主要类型。

模块 repository::copier 包含复制Debian仓库的功能。repository::copier::RepositoryCopier 是复制Debian仓库的主要类型。

模块[signing_key]提供了与PGP签名相关的功能。signing_key::DistroSigningKey 定义了流行Linux发行版使用的知名签名密钥的PGP公钥。[signing_key::signing_secret_key_params_builder()] 和 [signing_key::create_self_signed_key()] 使创建Debian仓库的签名密钥变得容易。

其他各种模块提供了各种功能。[io] 定义了I/O辅助工具,包括流适配器,用于读取时验证内容摘要和在写入时计算内容摘要。

包功能

可选的、默认启用的 http 功能启用了通过HTTP与Debian仓库交互的HTTP客户端支持。

依赖关系

~34–52MB
~1M SLoC