在“cargo build”期间获取活动依赖项及其版本的列表

问题描述 投票:0回答:1

有些板条箱提供 pub

const &str
版本字符串,有些则不提供。为了有一个通用的解决方案,我需要一个
cargo build
在编译过程中已知和使用的所有依赖项及其版本的列表,这样我就可以构建自己的
const &str
这是我自己的版本以及我编译的所有版本-调试输出。

是否可以在

build.rs
中获取所有依赖项及其版本的列表?

Cargo.lock
似乎是一个很好的来源。在
Cargo.lock
中解析
build.rs
实际上听起来合理吗?是否保证已更新为 Cargo 实际使用的内容并写入磁盘?

build dependencies rust rust-cargo
1个回答
0
投票

有一个板条箱:build-infolib.rsdocs.rs)。

它似乎无法自行生成包含依赖信息的

'static str
,但它会自动解析
Cargo.lock
并将相关信息包含到最终的二进制文件中,具有类似的效果。

示例代码(
build-info 0.0.32
)

如果您不想包含递归依赖项,则此代码比您可能需要的要复杂一些。

构建.rs

fn main() {
    build_info_build::build_script().collect_dependencies(true);
}

main.rs

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-auditcargo-auditable 以获取针对同一问题的面向安全的解决方案,前者甚至在某种程度上适用于本身不包含此功能的程序。不幸的是,虽然

cargo audit bin
可用于检查已编译的 Rust 程序中的已知安全漏洞,但我没有看到任何打印它恢复的库列表的标志。

© www.soinside.com 2019 - 2024. All rights reserved.