#package #rpm #cargo-build #cargo #cargo-subcommand

app cargo-generate-rpm

从 Cargo 项目生成二进制 RPM 软件包 (.rpm)

26 个版本 (14 个重大更改)

0.15.2 2024年7月19日
0.14.1 2024年6月12日
0.14.0 2024年1月6日
0.13.0 2023年9月23日
0.1.2 2020年10月25日

#47Cargo 插件

Download history 397/week @ 2024-04-28 451/week @ 2024-05-05 581/week @ 2024-05-12 485/week @ 2024-05-19 418/week @ 2024-05-26 472/week @ 2024-06-02 688/week @ 2024-06-09 426/week @ 2024-06-16 456/week @ 2024-06-23 509/week @ 2024-06-30 869/week @ 2024-07-07 739/week @ 2024-07-14 738/week @ 2024-07-21 1425/week @ 2024-07-28 907/week @ 2024-08-04 864/week @ 2024-08-11

4,087 每月下载量

MIT 许可证

105KB
2.5K SLoC

cargo-generate-rpm

Cargo 辅助命令,用于从 Cargo 项目生成二进制 RPM 软件包 (.rpm)。

此命令不依赖于 rpmbuild,并使用 rpm 包生成 RPM 软件包文件,而不需要 spec 文件。

Rust cargo-generate-rpm at crates.io

由于 rpm-rs 兼容性问题,不再支持需要 RPMv3 的旧系统(例如 CentOS 7)。对于此类系统,请使用 0.15 版本之前的版本。

安装

cargo install cargo-generate-rpm

用法

cargo build --release
strip -s target/release/XXX
cargo generate-rpm

在您的 cargo 项目中运行 cargo generate-rpm,将在 target/generate-rpm/XXX.rpm 中创建二进制 RPM 软件包文件。您可以使用 -o 选项更改 RPM 软件包文件位置。

预先运行 cargo build --release 并删除调试符号(strip -s target/release/XXX),因为这些目前不会在 cargo generate-rpm 中运行。

配置

此命令从 Cargo.toml 文件 生成 RPM 元数据

[package.metadata.generate-rpm] 选项

  • name: 包名。如果不存在,则使用 package.name
  • 版本:包的版本。如果不存在,则使用 package.version
  • 许可证:包的许可证。如果不存在,则使用 package.license
  • 摘要:包的摘要/描述。如果不存在,则使用 package.description
  • URL:包的主页URL。如果不存在,则使用 package.homepage。如果都不存在,则使用 package.repository
  • 资源:(必需)包含在包中的文件数组
    • 源:该资源在Rust项目中的位置。(例如 target/release/XXX)允许使用通配符 *
    • 目标:安装目标。(例如 /usr/bin/XXX)它应当是一个文件路径或以 / 结尾的目录路径。如果源包含通配符 *,则它必须是一个目录,而不是文件路径。
    • 模式:八进制字符串形式的权限。(例如 755 表示 -rwxr-xr-x
    • 配置:如果是配置文件,则设置为 true。为了避免覆盖已修改的现有文件,可以设置为字符串 "noreplace"。目前不支持 "missingok"
    • 文档:如果是文档文件,则设置为 true。
    • 用户:文件的拥有者。
    • 组:文件的组所有者。
    • 能力:可选的能力字符串。(例如 cap_sys_admin=pe
  • 发布:可选的发布字符串。
  • 纪元:可选的纪元数字。
  • 预安装脚本:可选的预安装脚本字符串或文件路径。
    • 预安装脚本标志:可选的整数值,用于设置脚本标志。
    • 预安装脚本程序:可选的字符串数组,用于设置脚本解释器/参数。
  • 预卸载脚本:可选的预卸载脚本字符串或文件路径。
    • 预卸载脚本标志:可选的整数值,用于设置脚本标志。
    • 预卸载脚本程序:可选的字符串数组,用于设置脚本解释器/参数。
  • 预转换脚本:可选的预转换脚本字符串或文件路径。
    • 预转换脚本标志:可选的整数值,用于设置脚本标志。
    • 预转换脚本程序:可选的字符串数组,用于设置脚本解释器/参数。
  • 预反向转换脚本:可选的预反向转换脚本字符串或文件路径。
    • 预反向转换脚本标志:可选的整数值,用于设置脚本标志。
    • 预反向转换脚本程序:可选的字符串数组,用于设置脚本解释器/参数。
  • 后安装脚本:可选的后安装脚本字符串或文件路径。
    • 后安装脚本标志:可选的整数值,用于设置脚本标志。
    • 后安装脚本程序:可选的字符串数组,用于设置脚本解释器/参数。
  • 后卸载脚本:可选的后卸载脚本字符串或文件路径。
    • 后卸载脚本标志:可选的整数值,用于设置脚本标志。
    • 后卸载脚本程序:可选的字符串数组,用于设置脚本解释器/参数。
  • 后转换脚本:可选的后转换脚本字符串或文件路径。
    • 后转换脚本标志:可选的整数值,用于设置脚本标志。
    • 后转换脚本程序:可选的字符串数组,用于设置脚本解释器/参数。
  • 后反向转换脚本:可选的后反向转换脚本字符串或文件路径。
    • 后反向转换脚本标志:可选的整数值,用于设置脚本标志。
    • 后反向转换脚本程序:可选的字符串数组,用于设置脚本解释器/参数。
  • 需要:可选的“需要”列表。
  • auto-req:可选字符串 "no" 以禁用自动依赖过程
  • require-sh:可选布尔值 false 以从需求中省略 /bin/sh
  • obsoletes:可选的 Obsoletes 列表
  • conflicts:可选的 Conflicts 列表
  • provides:可选的 Provides 列表
  • recommends:可选的 Recommends 列表
  • supplements:可选的 Supplements 列表
  • suggests:可选的 Suggests 列表
  • enhances:可选的 Enhances 列表
  • vendor:可选的 Vendor 字符串

添加如二进制文件、.desktop 文件或图标等资产时,应按照以下方式编写。

[package.metadata.generate-rpm]
assets = [
    { source = "target/release/XXX", dest = "/usr/bin/XXX", mode = "755" },
    { source = "<path_relative_to_project_root>/XXX.desktop", dest = "/usr/share/applications/XXX.desktop", mode = "644" },
    { source = "<path_relative_to_project_root>/*/apps/XXX.png", dest = "/usr/share/icons/hicolor/", mode = "644" },
]

[package.metadata.generate-rpm.{requires,obsoletes,conflicts,provides,recommends,supplements,suggests,enhances}] 选项

依赖关系如 "requires"、"obsoletes"、"conflicts" 和 "provides",以及弱依赖关系如 "recommends"、"supplements"、"suggests" 和 "enhances",应按照类似于 Cargo.toml 中的依赖关系的方式进行编写。

[package.metadata.generate-rpm.requires]
alternative = "*"
filesystem = ">= 3"

此示例表示该包需要 alternative 的任何版本以及 3.0 或更高版本的 filesystem

以下表格列出了版本比较

比较 含义
package= "*" 任何版本号的包
package= "< version" 版本号小于版本的包
package= "<= version" 版本号小于或等于版本的包
package= "= version" 版本号等于版本的包
package= "> version" 版本号大于版本的包
package= ">= version" 版本号大于或等于版本的包

需要在版本和符号(如 <<= 等)之间放置空格... package = "version" 不被接受,而是使用 package = "= version"

此命令会自动确定包所需的共享库。有时可能不希望自动处理依赖关系。包作者和用户可以配置处理。

  • --auto-req auto--auto-req 未指定:使用首选的自动依赖过程。以下规则适用
    • 如果 package.metadata.generate-rpm.auto-req 设置为 "no""disabled",则禁用该过程。
    • 如果存在 /usr/lib/rpm/find-requires,则使用它(与 --auto-req find-requires 相同的行为)。
    • 否则,使用内置过程(与 --auto-req builtin 相同的行为)。
  • --auto-req disabled--auto-req no:禁用依赖关系的发现。
  • --auto-req builtin:使用基于 ldd 的内置过程。
  • --auto-req find-requires:使用 /usr/lib/rpm/find-requires。此行为与原始的 rpmbuild 相同。
  • --auto-req /path/to/find-requires:使用指定的外部程序。

/bin/sh 总是被添加到软件包的要求中。要禁用它,设置 package.metadata.generate-rpm.require-shfalse。如果您使用如 pre_install_script 的脚本或者您的资产包含 shell 脚本,请不要这样做。

覆盖配置

[package.metadata.generate-rpm] 可以被覆盖。以下命令行选项被使用

  • --metadata-overwrite=TOML_FILE.toml:使用指定 TOML 文件的内容覆盖 [package.metadata.generate-rpm] 选项。可以指定多个文件,用逗号分隔。
  • --metadata-overwrite=TOML_FILE.toml#TOML.PATH:使用 TOML 文件中指定的 TOML 路径的表格覆盖 [package.metadata.generate-rpm] 选项。TOML 路径只能接受由点连接的键序列,不能包含引号键(例如 metadata."παραλλαγή")。可以指定具有 TOML 路径的多个文件,用逗号分隔。
  • -s 'toml "text"'--set-metadata='toml "text"':使用内联 TOML 文本覆盖 [package.metadata.generate-rpm] 选项。由于包含空格,内联 TOML 文本必须用引号括起来。
  • --variant=VARIANT:使用 TOML 文件中 [package.metadata.generate-rpm.variants.VARIANT] 中指定的表格覆盖 [package.metadata.generate-rpm] 选项。它是 --metadata-overwrite=path/to/Cargo.toml#package.metadata.generate-rpm.variants.VARIANT 的快捷方式。它旨在提供 Cargo.toml 中的多个元数据变体,并允许用户使用 --variant=name 选项选择变体。可以指定多个变体名称,用逗号分隔。

这些选项可以多次指定,最后写入的选项将生效,不论选项的类型。例如,参数 -s 'release = "alpha"' --metadata-overwrite=beta.toml,其中 beta.toml 包含 release = "beta",则最终给出 release = "beta"

高级用法

工作区

要从工作区中的成员生成RPM包,请在工作区目录中执行 cargo generate-rpm 命令,并通过选项 -p 指定包(目录路径)。

cargo build --release
strip -s target/release/XXX
cargo generate-rpm -p XXX

[package.metadata.generate-rpm] 选项应写入 XXX/Cargo.toml

当指定了选项 - 时,首先将资产文件 source 视为当前目录的相对路径。如果找不到,则将其视为包目录的相对路径。如果两者都找不到,cargo generate-rpm 将因错误而失败。

例如,source = target/bin/XXX 通常被视为当前目录的相对路径。因为工作区中的所有包都共享一个位于工作区目录中的 target 下的公共输出目录。

交叉编译

此命令支持与 cargo build 相同的 --target-dir--target--profile 选项。根据这些选项,此命令更改RPM包文件位置并替换资产的源位置的 target/release/

cargo build --release --target x86_64-unknown-linux-gnu
cargo generate-rpm --target x86_64-unknown-linux-gnu

当指定了 --target-dir TARGET-DIR--target x86_64-unknown-linux-gnu 时,将在 TARGET-DIR/x86_64-unknown-linux-gnu/generate-rpm/XXX.rpm 创建二进制RPM文件,而不是 target/generate-rpm/XXX.rpm。在这种情况下,资产的源 { source = "target/release/XXX", dest = "/usr/bin/XXX" } 将被视为 TARGET-DIR/x86_64-unknown-linux-gnu/release/XXX,而不是 target/release/XXX

您可以使用环境变量 CARGO_BUILD_TARGET 代替 --target 选项,以及使用 CARGO_BUILD_TARGET_DIRCARGO_TARGET_DIR 代替 --target-dir

类似地,如果您使用自定义构建配置,例如使用 --profile custom,则资产源 { source = "target/release/XXX" } 将被视为 target/custom/XXX

有效载荷压缩类型

生成的 RPM 文件的有效载荷默认压缩类型为 zstd。您可以使用 --payload-compress TYPE 指定有效载荷压缩类型:none、gzip 或 zstd。

脚本标志和程序设置

可以通过 *_script_flags*_script_prog 设置来配置脚本标志。

脚本标志

标志 设置值 描述 示例用法
RPMSCRIPT_FLAG_EXPAND 1 启用宏展开 pre_install_script_flags= 0b001
RPMSCRIPT_FLAG_QFORMAT 2 启用标题查询格式展开 pre_install_script_flags= 0b010
RPMSCRIPT_FLAG_CRITICAL 4 启用脚本的成功或失败的关键严重性 pre_install_script_flags= 0b100

示例

pre_install_script = """
echo preinstall
"""
pre_install_script_flags = 0b011 # Enables EXPAND and QFORMAT flags
pre_install_script_prog = ["/bin/blah/bash", "-c"] # Sets the interpreter/argument settings for the scriptlet

依赖关系

~11MB
~203K SLoC