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日 |
#47 在 Cargo 插件
4,087 每月下载量
105KB
2.5K SLoC
cargo-generate-rpm
Cargo 辅助命令,用于从 Cargo 项目生成二进制 RPM 软件包 (.rpm)。
此命令不依赖于 rpmbuild
,并使用 rpm
包生成 RPM 软件包文件,而不需要 spec 文件。
由于 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
)
- 源:该资源在Rust项目中的位置。(例如
- 发布:可选的发布字符串。
- 纪元:可选的纪元数字。
- 预安装脚本:可选的预安装脚本字符串或文件路径。
- 预安装脚本标志:可选的整数值,用于设置脚本标志。
- 预安装脚本程序:可选的字符串数组,用于设置脚本解释器/参数。
- 预卸载脚本:可选的预卸载脚本字符串或文件路径。
- 预卸载脚本标志:可选的整数值,用于设置脚本标志。
- 预卸载脚本程序:可选的字符串数组,用于设置脚本解释器/参数。
- 预转换脚本:可选的预转换脚本字符串或文件路径。
- 预转换脚本标志:可选的整数值,用于设置脚本标志。
- 预转换脚本程序:可选的字符串数组,用于设置脚本解释器/参数。
- 预反向转换脚本:可选的预反向转换脚本字符串或文件路径。
- 预反向转换脚本标志:可选的整数值,用于设置脚本标志。
- 预反向转换脚本程序:可选的字符串数组,用于设置脚本解释器/参数。
- 后安装脚本:可选的后安装脚本字符串或文件路径。
- 后安装脚本标志:可选的整数值,用于设置脚本标志。
- 后安装脚本程序:可选的字符串数组,用于设置脚本解释器/参数。
- 后卸载脚本:可选的后卸载脚本字符串或文件路径。
- 后卸载脚本标志:可选的整数值,用于设置脚本标志。
- 后卸载脚本程序:可选的字符串数组,用于设置脚本解释器/参数。
- 后转换脚本:可选的后转换脚本字符串或文件路径。
- 后转换脚本标志:可选的整数值,用于设置脚本标志。
- 后转换脚本程序:可选的字符串数组,用于设置脚本解释器/参数。
- 后反向转换脚本:可选的后反向转换脚本字符串或文件路径。
- 后反向转换脚本标志:可选的整数值,用于设置脚本标志。
- 后反向转换脚本程序:可选的字符串数组,用于设置脚本解释器/参数。
- 需要:可选的“需要”列表。
- 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-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."παραλλαγή"
)。可以指定具有 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_DIR
或 CARGO_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