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

rekjcdws  于 2023-10-20  发布在  Go
关注(0)|答案(1)|浏览(220)

有些crate提供pub const &str版本字符串,有些则没有。为了有一个通用的解决方案,我需要一个cargo build在编译过程中已知和使用的所有依赖项及其版本的列表,这样我就可以构建我自己的const &str * 这是我自己的版本,我编译的所有版本都是 *-输出。
是否可以获得build.rs中所有依赖项及其版本的列表?
Cargo.lock似乎是一个很好的来源。在build.rs中解析Cargo.lock真的合理吗?它是否保证已经更新到Cargo实际使用的内容并写入磁盘?

vmdwslir

vmdwslir1#

有一个箱子可以装这个:build-infolib.rsdocs.rs)。
它似乎不能自己生成包含依赖信息的'static str,但它会自动解析Cargo.lock并将相关信息包含到最终的二进制文件中,效果类似。

示例代码(build-info 0.0.32

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

build.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程序中的已知安全漏洞,但我没有看到任何标志可以打印它恢复的库列表。

相关问题