12个版本 (7个重大变更)

0.15.1 2024年7月26日
0.14.0 2024年3月3日
0.13.1 2023年12月11日
0.13.0 2023年11月30日
0.0.0 2017年9月28日

#75 in 解析器实现

Download history 1300/week @ 2024-05-01 1394/week @ 2024-05-08 1277/week @ 2024-05-15 1484/week @ 2024-05-22 1819/week @ 2024-05-29 1998/week @ 2024-06-05 1977/week @ 2024-06-12 1937/week @ 2024-06-19 2167/week @ 2024-06-26 2488/week @ 2024-07-03 2284/week @ 2024-07-10 2123/week @ 2024-07-17 3021/week @ 2024-07-24 2890/week @ 2024-07-31 2921/week @ 2024-08-07 2419/week @ 2024-08-14

每月11,677次下载
10 个crate中(8个直接) 使用

Apache-2.0 OR MIT

285KB
6K SLoC

crates.io docs.rs MSRV

RPM-RS

用于解析和创建RPM文件的纯Rust库。

目标

  • 易于使用的API
  • 纯Rust以使其在大项目中易于使用
  • 与Spec文件的独立性。纯编程接口用于包装。
  • 兼容性从企业Linux 8(RHEL、Alma、Rocky、CentOS Stream)到Fedora(我可能会扩展SUSE的测试用例)

非目标

RPM有很多神秘的特性。我不想重实现它们的所有功能。这个库专注于我认为有用的功能。这个库不会像rpmbuild那样构建软件。它用于需要打包为RPM的成品。

状态

  • RPM创建
  • 基本RPM读取
  • RPM签名和签名验证
  • RPM读取的高级API

示例

use rpm::signature::pgp::{Signer, Verifier};

let raw_secret_key = std::fs::read("./test_assets/secret_key.asc")?;
// It's recommended to use timestamp of last commit in your VCS
let source_date = 1_600_000_000;
let pkg = rpm::PackageBuilder::new("test", "1.0.0", "MIT", "x86_64", "some awesome package")
    .compression(rpm::CompressionType::Gzip)
    .with_file(
        "./test_assets/awesome.toml",
        rpm::FileOptions::new("/etc/awesome/config.toml")
            .is_config()
            .is_no_replace(),
    )?
    // file mode is inherited from source file
    .with_file(
        "./test_assets/awesome.py",
        rpm::FileOptions::new("/usr/bin/awesome"),
    )?
    .with_file(
        "./test_assets/awesome.toml",
        // you can set a custom mode and custom user too
        rpm::FileOptions::new("/etc/awesome/second.toml")
            .mode(rpm::FileMode::regular(0o644))
            .caps("cap_sys_admin,cap_net_admin=pe")?
            .user("hugo"),
    )?
    .pre_install_script("echo preinst")
    // Alternatively, use scriptlet builder api to specify flags and interpreter/arguments
    .post_trans_script(
        Scriptlet::new("echo posttrans")
            .flags(ScriptletFlags::EXPAND)
            .prog(vec!["/bin/blah/bash", "-c"])
    )
    // If you don't need reproducible builds,
    // you can remove the following line
    .source_date(source_date)
    .build_host(gethostname::gethostname().to_str().unwrap_or("host"))
    .add_changelog_entry(
        "Max Mustermann <[email protected]> - 0.1-29",
        "- was awesome, eh?",
        chrono::DateTime::parse_from_rfc2822("Wed, 19 Apr 2023 23:16:09 GMT")
            .expect("Date 1 is correct. qed"),
    )
    .add_changelog_entry(
        "Charlie Yom <[email protected]> - 0.1-28",
        "- yeah, it was",
        // Raw timestamp for 1996-08-14 05:20:00
        840_000_000,
    )
    .requires(rpm::Dependency::any("wget"))
    .vendor("corporation or individual")
    .url("www.github.com/repo")
    .vcs("git:repo=example_repo:branch=example_branch:sha=example_sha")
    .build_and_sign(Signer::load_from_asc_bytes(&raw_secret_key)?)?;

pkg.write_file("./awesome.rpm")?;

// reading
let raw_pub_key = std::fs::read("/path/to/gpg.key.pub")?;
let pkg = rpm::Package::open("test_assets/389-ds-base-devel-1.3.8.4-15.el7.x86_64.rpm")?;

let name = pkg.metadata.get_name()?;
let version = pkg.metadata.get_version()?;
let release = pkg.metadata.get_release()?;
let arch = pkg.metadata.get_arch()?;

println!("{}-{}-{}.{}", name, version, release, arch);

for changelog in pkg.metadata.get_changelog_entries()? {
    println!("{}\n{}\n", changelog.name, changelog.description);
}

// verifying
pkg.verify_signature(Verifier::load_from_asc_bytes(&raw_pub_key)?)?;

依赖关系

~7–17MB
~214K SLoC