Crate debian_packaging
source · [−]Expand description
Debian packaging primitives.
This crate defines pure Rust implementations of Debian packaging primitives. Debian packaging
(frequently interacted with by tools like apt
and apt-get
) provides the basis for
packaging on Debian-flavored Linux distributions like Debian and Ubuntu.
The canonical home of this crate is https://github.com/indygreg/PyOxidizer. Please file issues and pull requests there.
Goals
Compliance and Compatibility
We want this crate to be as-compliant and as-compatible as possible with in-the-wild Debian packaging deployments so it can be used as a basis to implementing tools which consume and produce entities that are compatible with the official Debian packaging implementations.
This crate could be considered an attempt to reimplement aspects of
apt in pure Rust. (The apt
repository defines
command line tools like apt-get
as well as libraries like libapt-pkg
and libapt-inst
.
This crate is more focused on providing the library-level interfaces. However, a goal is
to have as much code be usable as a library so the surface area of any tools is minimal.)
Determinism and Reproducibility
To help combat the rise in software supply chain attacks and to make debugging and testing easier, a goal of this crate is to be as deterministic and reproducible as possible.
Given the same source code / version of this crate, operations like creating a .deb
file
or building a repository from indexed .deb
files should be as byte-for-byte identical as
reasonably achievable.
Performance
We strive for highly optimal implementations of packaging primitives wherever possible.
We want to facilitate intensive operations (like reading all packages in a Debian repository) or publishing to a repository to scale out to as many CPU cores as possible.
Read operations like parsing control files or version strings should be able to use 0-copy to avoid excessive memory allocations and copying.
A Tour of Functionality
A .deb
file defines a Debian package. Readers and writers of .deb
files exist in the
deb module. To read the contents of a .deb
defining a binary package, use
deb::reader::BinaryPackageReader. To create new .deb
files, use deb::builder::DebBuilder.
A common primitive within Debian packaging is control files. These consist of paragraphs of key-value metadata. Low-level control file primitives are defined in the control module. control::ControlParagraph defines a paragraph, which consists of control::ControlField. control::ControlFile provides an interface for a control file, which consists of multiple paragraphs. control::ControlParagraphReader implements a streaming reader of control files and control::ControlParagraphAsyncReader implements an asynchronous streaming reader.
There are different flavors of control files within Debian packaging.
binary_package_control::BinaryPackageControlFile defines a control file for a binary package.
This type provides helper functions for resolving common fields on binary control files.
debian_source_control::DebianSourceControlFile defines a control file for a source package,
as expressed in a .dsc
file.
There is a meta language for expressing dependencies between Debian packages. The
dependency module defines types for parsing and writing this language. e.g.
dependency::DependencyList represents a parsed list of dependencies like
libc6 (>= 2.4), libx11-6
. dependency::PackageDependencyFields represents a collection
of control fields that define relationships between packages.
The package_version module implements Debian package version string parsing, serialization, and comparison. package_version::PackageVersion is the main type used for this.
The dependency_resolution module implements functionality related to resolving dependencies. e.g. dependency_resolution::DependencyResolver can be used to index known binary packages and find direct and transitive dependencies. This could be used as the basis for a package manager or other tool wishing to walk the dependency tree for a given package.
The repository module provides functionality related to Debian repositories, which are
publications of Debian packages and metadata. The repository::RepositoryRootReader trait
provides an interface for reading the root directory of a repository and
repository::ReleaseReader provides an interface for reading content from a parsed
[In]Release
file. The repository::RepositoryWriter trait abstracts I/O for writing
to a repository. Repository interaction involves many support primitives.
repository::release::ReleaseFile represents an [In]Release
file. Support for verifying
PGP signatures is provided. repository::contents::ContentsFile represents a Contents
file.
Concrete implementations of repository interaction exist. repository::http::HttpRepositoryClient
enables reading from an HTTP-hosted repository (e.g. http://archive.canonical.com/ubuntu
).
repository::filesystem::FilesystemRepositoryWriter enables writing repositories to a local
filesystem.
The repository::builder module contains functionality for creating and publishing Debian repositories. repository::builder::RepositoryBuilder is the main type for publishing Debian repositories.
The repository::copier module contains functionality for copying Debian repositories. repository::copier::RepositoryCopier is the main type for copying Debian repositories.
The signing_key module provides functionality related to PGP signing. signing_key::DistroSigningKey defines PGP public keys for well-known signing keys used by popular Linux distributions. signing_key::signing_secret_key_params_builder() and signing_key::create_self_signed_key() enable easily creating signing keys for Debian repositories.
Various other modules provide miscellaneous functionality. io defines I/O helpers, including stream adapters for validating content digests on read and computing content digests on write.
Crate Features
The optional and enabled-by-default http
feature enables HTTP client support for interacting
with Debian repositories via HTTP.
Modules
Debian binary package control files.
Interface with a collection of binary package control definitions.
Defines types representing debian/changelog files.
Defines primitives in control files.
Interfaces for .deb package files.
Debian source control files.
A collection of source control package control files.
Debian package dependency syntax handling.
Package dependency resolution.
Error handling.
I/O helpers.
Debian package version string handling.
Debian repositories.
PGP signing keys.
Source package control files.