有些板条箱提供 pub
const &str
版本字符串,有些则不提供。为了有一个通用的解决方案,我需要一个 cargo build
在编译过程中已知和使用的所有依赖项及其版本的列表,这样我就可以构建自己的 const &str
的 这是我自己的版本以及我编译的所有版本-调试输出。
是否可以在
build.rs
中获取所有依赖项及其版本的列表?
Cargo.lock
似乎是一个很好的来源。在 Cargo.lock
中解析 build.rs
实际上听起来合理吗?是否保证已更新为 Cargo 实际使用的内容并写入磁盘?
有一个板条箱:build-info(lib.rs,docs.rs)。
它似乎无法自行生成包含依赖信息的
'static str
,但它会自动解析Cargo.lock
并将相关信息包含到最终的二进制文件中,具有类似的效果。
build-info 0.0.32
)如果您不想包含递归依赖项,则此代码比您可能需要的要复杂一些。
fn main() {
build_info_build::build_script().collect_dependencies(true);
}
use std::collections::BTreeSet;
build_info::build_info!(fn build_info);
/// Collect all of the dependencies of this workspace into a single set.
fn get_dependencies() -> BTreeSet<(&'static str, &'static build_info::semver::Version)> {
// called recursively on each of the dependencies in the tree
fn visit(
info: &'static build_info::CrateInfo,
set: &mut BTreeSet<(&'static str, &'static build_info::semver::Version)>,
) {
set.insert((&info.name, &info.version));
for dep in &info.dependencies {
visit(dep, set);
}
}
let mut set = BTreeSet::new();
let root_info = &build_info().crate_info;
visit(root_info, &mut set);
set
}
fn main() {
for (name, version) in get_dependencies() {
println!("{} {}", name, version);
}
}
查看 cargo-audit 和 cargo-auditable 以获取针对同一问题的面向安全的解决方案,前者甚至在某种程度上适用于本身不包含此功能的程序。不幸的是,虽然
cargo audit bin
可用于检查已编译的 Rust 程序中的已知安全漏洞,但我没有看到任何打印它恢复的库列表的标志。