4 个版本 (破坏性更新)
0.4.0 | 2023 年 11 月 18 日 |
---|---|
0.3.0 | 2023 年 6 月 11 日 |
0.2.0 | 2023 年 6 月 1 日 |
0.1.0 | 2023 年 4 月 4 日 |
#833 在 Unix API 中
每月 36 次下载
125KB
2K SLoC
alpm-types
Arch Linux 包管理类型。
提供的类型及其实现的特性和属性可用于与包管理相关的应用程序(例如包管理器、仓库管理器、专用解析器和文件规范等),这些应用程序处理基于 libalpm 的包。
该库力求作为一个叶子库提供所有底层类型,以便在应用程序之间共享,并且不需要任何应用程序自己实现。
文档
- https://alpm-types.archlinux.page/alpm_types/(库的开发版本)
- https://docs.rs/alpm-types/latest/alpm_types/(库的发布版本)
示例
系统
已知的 CPU 架构由 Architecture
枚举表示。您可以从字符串创建成员等。
use std::str::FromStr;
use alpm_types::Architecture;
assert_eq!(Architecture::from_str("aarch64"), Ok(Architecture::Aarch64));
校验和
校验和为支持的算法集以通用方式实现
Blake2b512
Md5
(警告:强烈不建议使用此算法,因为它在密码学上是不安全的)Sha1
(警告:强烈不建议使用此算法,因为它在密码学上是不安全的)Sha224
Sha256
Sha384
Sha512
注意:与 makepkg/pacman 不同,该库不支持使用非标准的 CRC-32(在不同库中具有不同的实现)和密码学上不安全的 cksum-style。
上述算法在 crate 的 digests
模块中重新导出,因此用户无需添加 blake2、md-5、sha1 或 sha2 crate,而只需依赖 alpm-types
。
use std::str::FromStr;
use alpm_types::{digests::Blake2b512, Checksum};
let checksum = Checksum::<Blake2b512>::calculate_from("foo\n");
let digest = vec![
210, 2, 215, 149, 29, 242, 196, 183, 17, 202, 68, 180, 188, 201, 215, 179, 99, 250, 66,
82, 18, 126, 5, 140, 26, 145, 14, 192, 91, 108, 208, 56, 215, 28, 194, 18, 33, 192, 49,
192, 53, 159, 153, 62, 116, 107, 7, 245, 150, 92, 248, 197, 195, 116, 106, 88, 51, 122,
217, 171, 101, 39, 142, 119,
];
assert_eq!(checksum.inner(), digest);
assert_eq!(
format!("{}", checksum),
"d202d7951df2c4b711ca44b4bcc9d7b363fa4252127e058c1a910ec05b6cd038d71cc21221c031c0359f993e746b07f5965cf8c5c3746a58337ad9ab65278e77",
);
// create checksum from hex string
let checksum = Checksum::<Blake2b512>::from_str("d202d7951df2c4b711ca44b4bcc9d7b363fa4252127e058c1a910ec05b6cd038d71cc21221c031c0359f993e746b07f5965cf8c5c3746a58337ad9ab65278e77").unwrap();
assert_eq!(checksum.inner(), digest);
日期
使用 BuildDate
结构体表示包构建的日期,该结构体以自纪元以来的秒跟踪此信息。
除了可以从 i64 或 str 创建 BuildDate 之外,还可以从 DateTime<Utc>
创建。
use time::OffsetDateTime;
use alpm_types::BuildDate;
let datetime: BuildDate = OffsetDateTime::from_unix_timestamp(1).unwrap().into();
assert_eq!(BuildDate::new(1), datetime);
环境
构建环境中的可用选项使用 BuildEnv
跟踪。
use alpm_types::BuildEnv;
let option = BuildEnv::new("foo").unwrap();
assert_eq!(option.on(), true);
assert_eq!(option.name(), "foo");
安装到环境中的软件包可以使用 Installed
描述。
use alpm_types::Installed;
assert!(Installed::new("foo-1:1.0.0-1-any").is_ok());
assert!(Installed::new("foo-1:1.0.0-1-foo").is_err());
assert!(Installed::new("foo-1:1.0.0-any").is_err());
用于打包的选项使用 PackageOption
跟踪。
use alpm_types::PackageOption;
let option = PackageOption::new("foo").unwrap();
assert_eq!(option.on(), true);
assert_eq!(option.name(), "foo");
大小
软件包的压缩大小由 CompressedSize
表示,它跟踪字节数量,也可以从 str 创建。
use alpm_types::CompressedSize;
use std::str::FromStr;
assert_eq!(CompressedSize::from_str("1"), Ok(CompressedSize(1)));
软件包的安装大小由 InstalledSize
表示,它跟踪字节数量,也可以从 str 创建。
use alpm_types::InstalledSize;
use std::str::FromStr;
assert_eq!(InstalledSize::from_str("1"), Ok(InstalledSize(1)));
名称
软件包的名称限制在特定字符集。您可以直接或从 str 创建 Name
,这将返回一个 Result。
use std::str::FromStr;
use alpm_types::{Error, Name};
assert_eq!(Name::from_str("[email protected]_+"), Name::new("[email protected]_+".to_string()));
assert_eq!(Name::from_str(".foo"), Err(Error::InvalidName(".foo".to_string())));
路径
软件包构建环境的构建目录可以使用 BuildDir
描述。
use alpm_types::BuildDir;
let builddir = BuildDir::new("/build").unwrap();
assert_eq!("/build", format!("{}", builddir));
软件包构建环境的起始目录可以使用 StartDir
描述。
use alpm_types::StartDir;
let startdir = StartDir::new("/start").unwrap();
assert_eq!("/start", format!("{}", startdir));
Pkg
软件包的作者使用 Packager
类型标识,该类型描述用户 ID(名称和有效电子邮件地址)。
use std::str::FromStr;
use alpm_types::Packager;
let packager = Packager::new("Foobar McFooface <[email protected]>").unwrap();
assert_eq!("Foobar McFooface", packager.name());
assert_eq!("[email protected]", packager.email().to_string());
使用 PkgType
枚举区分软件包类型。其变体可以从 str 构造。
use std::str::FromStr;
use alpm_types::PkgType;
assert_eq!(PkgType::from_str("pkg"), Ok(PkgType::Package));
源
软件包的源可以使用 Source
描述(由可选的 Filename
和 SourceLocation
组成)。
use alpm_types::{Filename, Source, SourceLocation};
let source = Source::new("foopkg-1.2.3.tar.gz::https://example.com/download").unwrap();
assert_eq!(source.filename.unwrap(), Filename::new("foopkg-1.2.3.tar.gz".to_string()).unwrap());
let SourceLocation::Url(url) = source.location else { panic!() };
版本
构建工具的版本和 CPU 架构使用 BuildToolVer
跟踪。
use alpm_types::BuildToolVer;
let buildtoolver = BuildToolVer::new("1.0.0-1-any").unwrap();
assert_eq!("1.0.0-1-any", format!("{}", buildtoolver));
复合类型的模式(例如,用于描述 .BUILDINFO
或 .PKGINFO
文件)需要模式版本来为其功能进行版本控制。这就是 SchemaVersion
的用途。
use std::str::FromStr;
use alpm_types::SchemaVersion;
let version = SchemaVersion::new("1.0.0").unwrap();
assert_eq!("1.0.0", format!("{}", version));
软件包版本的处理由 Version
类型(由可选的 Epoch
、Pkgver
和可选的 Pkgrel
组成)覆盖。它的 vercmp()
方法实现与 libalpm/pacman 的 vercmp
兼容。
use std::str::FromStr;
use alpm_types::Version;
let version = Version::new("1.0.0").unwrap();
assert_eq!("1.0.0", format!("{}", version));
let version_a = Version::new("1.0.0").unwrap();
let version_b = Version::new("1.1.0").unwrap();
assert_eq!(Version::vercmp(&version_a, &version_b), -1);
// create a Version that is guaranteed to have a Pkgrel
assert!(Version::with_pkgrel("1.0.0-1").is_ok());
assert!(Version::with_pkgrel("1.0.0").is_err());
可以使用 VersionComparison
和 VersionRequirement
进行版本比较。
use std::str::FromStr;
use alpm_types::{Version, VersionComparison, VersionRequirement};
let requirement = VersionRequirement::new(">=1.5-1").unwrap();
assert_eq!(requirement.comparison, VersionComparison::GreaterOrEqual);
assert_eq!(requirement.version, Version::new("1.5-1").unwrap());
assert!(requirement.is_satisfied_by(&Version::new("1.5-3").unwrap()));
贡献
请参阅贡献指南,了解如何为此项目做出贡献。
许可证
本项目根据LGPL-3.0-or-later 许可证条款授权。
依赖
~4.5–6.5MB
~149K SLoC