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日 |
#376 在 Unix API
27 每月下载量
用于 2 crates
410KB
8K SLoC
debian-packaging
debian-packaging
是一个库crate,实现了与 Debian 打包相关的功能。以下功能已(部分)实现:
- 解析和序列化控制文件
- 解析
Release
和InRelease
文件。 - 解析
Packages
文件。 - 从 HTTP 服务器获取 Debian 仓库文件。
- 编写变更日志文件。
- 读取和写入
.deb
文件。 - 创建仓库。
- PGP 签名和验证操作。
请参阅 crate 的文档以获取更多信息。
lib.rs
:
Debian 打包原语。
此 crate 定义了 Debian 打包原语的纯 Rust 实现。Debian 打包(通常与 apt
和 apt-get
等工具交互)为 Debian 和 Ubuntu 等基于 Debian 的 Linux 发行版的打包提供了基础。
目标
合规性和兼容性
我们希望此 crate 与现场 Debian 打包部署尽可能兼容,以便可以作为实现消耗和生成与官方 Debian 打包实现兼容的实体的工具的基础。
此 crate 可以被认为是尝试在纯 Rust 中重新实现 apt 的方面。(apt
仓库定义了像 apt-get
这样的命令行工具以及像 libapt-pkg
和 libapt-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-6
。 dependency::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