跳转到主要内容

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

项目描述

cargo-generate-rpm

Cargo 命令行工具,用于从Cargo项目生成二进制 RPM包 (.rpm)。

此命令不依赖于 rpmbuild,并使用 rpm-rs 生成没有spec文件的RPM包文件。

Rust cargo-generate-rpm at crates.io

安装

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 generate-rpm 之前,先运行 cargo run --release 并删除调试符号(strip -s target/release/XXX),因为这些符号在当前版本中不会在 cargo generate-rpm 中运行。

配置

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

[package.metadata.generate-rpm] 选项

  • name:包名。如果不存在,则使用 package.name
  • version:包版本。如果不存在,则使用 package.version
  • license:包许可证。如果不存在,则使用 package.license
  • summary:包摘要/描述。如果不存在,则使用 package.description
  • url:包主页URL。如果不存在,则使用 package.homepage。如果两者都不存在,则使用 package.repository
  • assets:(必需) 包中包含的文件数组
    • source:该资产的Rust项目位置。(例如:target/release/XXX)允许使用通配符 *
    • dest:安装目标。(例如:/usr/bin/XXX)它应该是文件路径或以 / 结尾的目录路径。如果source包含通配符 *,则它必须是一个目录,而不是文件路径。
    • 模式:以八进制字符串表示的权限。(例如,755 表示 -rwxr-xr-x
    • config:如果是一个配置文件,则设置为true。
    • doc:如果是一个文档文件,则设置为true。
    • user:文件的拥有者。
    • group:文件的组拥有者。
  • release:可选的发布字符串。
  • epoch:可选的纪元数字。
  • pre_install_script:可选的预安装脚本字符串。
  • pre_uninstall_script:可选的预卸载脚本字符串。
  • post_install_script:可选的安装后脚本字符串。
  • post_uninstall_script:可选的卸载后脚本字符串。
  • requires:可选的依赖项列表。
  • auto-req:可选字符串 "no" 用于禁用自动依赖项处理。
  • require-sh:可选布尔值 false 用于省略 Requirements 中的 /bin/sh
  • obsoletes:可选的过时列表。
  • conflicts:可选的冲突列表。
  • provides:可选的提供列表。
  • 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}] 选项

依赖项如 "requires"、"obsoletes"、"conflicts" 和 "provides" 应与 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"

此命令自动确定软件包所需的共享库。有时可能不希望自动依赖项处理。在这种情况下,软件包作者可以将 package.metadata.generate-rpm.auto-req 设置为 "no",或者执行此命令的用户可以指定命令行选项 --auto-req no

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

/bin/sh 总是添加到软件包要求中。要禁用它,将 package.metadata.generate-rpm.require-sh 设置为 false。如果您使用 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."παραλλαγή")的路径不可接受。
  • -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

当指定了选项 -p 时,首先,资产文件 source 应被视为从当前目录的相对路径。如果未找到,则被视为从包的目录的相对路径。如果两者都未找到,则 cargo generate-rpm 将失败并显示错误。

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

交叉编译

此命令支持与 cargo build 相同的 --target-dir--target 选项。根据这些选项,此命令更改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 时,将创建一个二进制RPM文件,位于 TARGET-DIR/x86_64-unknown-linux-gnu/generate-rpm/XXX.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

有效载荷压缩类型

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

对于旧系统(例如centos7),请明确指定旧压缩类型,例如 --payload-compress none

项目详情


下载文件

为您的平台下载文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分发

此版本没有可用的源分发文件。请参阅 生成分发存档教程

构建分发

cargo_generate_rpm-0.10.1-py3-none-win_amd64.whl (967.1 kB 查看哈希)

上传于 Python 3 Windows x86-64

cargo_generate_rpm-0.10.1-py3-none-win32.whl (903.1 kB 查看哈希)

上传于 Python 3 Windows x86

cargo_generate_rpm-0.10.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB 查看哈希)

上传于 Python 3 manylinux: glibc 2.17+ x86-64

cargo_generate_rpm-0.10.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (2.2 MB 查看哈希)

上传于 Python 3 manylinux: glibc 2.17+ i686

cargo_generate_rpm-0.10.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.0 MB 查看哈希)

上传于 Python 3 manylinux: glibc 2.17+ ARM64

cargo_generate_rpm-0.10.1-py3-none-macosx_11_0_arm64.whl (1.2 MB 查看哈希)

上传于 Python 3 macOS 11.0+ ARM64

cargo_generate_rpm-0.10.1-py3-none-macosx_10_7_x86_64.whl (1.3 MB 查看哈希)

上传于 Python 3 macOS 10.7+ x86-64

由以下机构支持