深入理解 Cargo 配置文件与 metadata 的使用
可以通过 config.toml 对 cargo 配置
总体原则是:Cargo
会顺着当前目录往上查找,直到找到目标配置文件。例如我们在目录 /projects/foo/bar/baz
下调用 Cargo 命令,那查找路径如下所示:
/projects/foo/bar/baz/.cargo/config.toml
/projects/foo/bar/.cargo/config.toml
/projects/foo/.cargo/config.toml
/projects/.cargo/config.toml
/.cargo/config.toml
$CARGO_HOME/config.toml
默认是 :- Windows:
%USERPROFILE%\.cargo\config.toml
- Unix:
$HOME/.cargo/config.toml
- Windows:
1 |
|
cargo.toml 配置项
[package.metadata]
的特点
专用配置区:
- Cargo 对
metadata
区块没有内置的语义,不会直接处理该部分内容。 - 其目的是让外部工具、插件或构建脚本提取相关信息并据此操作。
- Cargo 对
可扩展性:
- 允许用户根据工具需求自由定义配置,具有很高的灵活性。
常见用途:
- 为特定工具提供配置。
- 在构建阶段(如构建脚本
build.rs
)读取自定义配置。 - 传递自定义参数或标志。
[package.metadata.deb]
的用途
在你的例子中,[package.metadata.deb]
很可能是为与 .deb
包相关的工具提供配置,例如:
Cargo Debian:
- 一个 Cargo 插件,用于构建 Debian 包(
.deb
文件)。 - 需要在
Cargo.toml
中指定元数据,定义包的名称、依赖项、描述等信息。
示例:
1
2
3
4
5[package.metadata.deb]
name = "my-project"
maintainer = "Your Name <your.email@example.com>"
description = "A Rust project packaged as a .deb file"
depends = ["libssl1.1", "zlib1g"]- 字段作用:
name
:在 Debian 系统中显示的包名。maintainer
:维护者信息。description
:包的描述。depends
:声明此包运行时依赖的系统库。
- 一个 Cargo 插件,用于构建 Debian 包(
如何读取 metadata
配置
通过构建脚本读取: 如果你定义了
build.rs
脚本,可以通过CARGO_MANIFEST_DIR
和toml
库读取metadata
。示例
build.rs
:1
2
3
4
5
6
7
8
9
10
11
12
13use std::fs;
use toml::Value;
fn main() {
let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap();
let manifest_path = format!("{}/Cargo.toml", manifest_dir);
let content = fs::read_to_string(manifest_path).unwrap();
let value: Value = content.parse().unwrap();
if let Some(metadata) = value.get("package").and_then(|pkg| pkg.get("metadata")) {
println!("Metadata: {:?}", metadata);
}
}外部工具读取: 工具如
cargo deb
会自动解析[package.metadata.deb]
部分,无需额外操作。
常见工具支持的元数据
cargo-deb
:- 需要
metadata.deb
部分配置 Debian 包信息。
- 需要
cargo-nix
:- 读取
metadata.nix
,为 NixOS 包管理提供配置。
- 读取
- 自定义工具:
- 任意工具或脚本可以利用
metadata
部分存储专用配置。
- 任意工具或脚本可以利用
深入理解 Cargo 配置文件与 metadata 的使用
https://abrance.github.io/2025/04/03/mdstorage/domain/rust/cargo配置项/