【问题标题】:How can a Rust program access metadata from its Cargo package?Rust 程序如何从其 Cargo 包中访问元数据?
【发布时间】:2015-03-06 14:00:17
【问题描述】:

如何从包中的 Rust 代码访问 Cargo 包的元数据(例如版本)?就我而言,我正在构建一个命令行工具,我希望有一个标准的--version 标志,并且我希望实现从Cargo.toml 读取包的版本,所以我不必在两个地方维护它。我可以想象还有其他原因可能有人想要从程序中访问 Cargo 元数据。

【问题讨论】:

    标签: rust rust-cargo


    【解决方案1】:

    Cargo 通过环境变量将一些元数据传递给编译器,其列表可以在Cargo documentation pages 中找到。

    编译器环境由 Cargo 代码中的 fill_env 填充。自早期版本以来,此代码变得更加复杂,并且整个变量列表不再明显,因为它可以是动态的。但是,至少在那里设置了以下变量(来自the list in the docs):

    CARGO_MANIFEST_DIR
    CARGO_PKG_AUTHORS
    CARGO_PKG_DESCRIPTION
    CARGO_PKG_HOMEPAGE
    CARGO_PKG_NAME
    CARGO_PKG_REPOSITORY
    CARGO_PKG_VERSION
    CARGO_PKG_VERSION_MAJOR
    CARGO_PKG_VERSION_MINOR
    CARGO_PKG_VERSION_PATCH
    CARGO_PKG_VERSION_PRE
    

    您可以使用env!() 宏访问环境变量。要插入程序的版本号,您可以这样做:

    const VERSION: &str = env!("CARGO_PKG_VERSION");
    
    // ...
    
    println!("MyProgram v{}", VERSION);
    

    如果你想让你的程序在没有 Cargo 的情况下也能编译,你可以使用option_env!():

    const VERSION: Option<&str> = option_env!("CARGO_PKG_VERSION");
    
    // ...
    
    println!("MyProgram v{}", VERSION.unwrap_or("unknown"));
    

    【讨论】:

    • 这是运行时还是编译时?
    • @debuti 编译时间,如 in the documentation 所述
    • 只是对搜索者说,因为这是一个编译时解决方案并使用环境变量,所以这不会解析为工作区成员的 subcrate 元数据。
    【解决方案2】:

    built-crate 有助于在没有所有样板的情况下序列化大量 Cargo 的环境。

    【讨论】:

    • built 还添加了 git sha-1(以及许多其他有用的东西)
    【解决方案3】:

    在构建时(如build.rs),cargo_metadata 可能有用。例如:

    let path = std::env::var("CARGO_MANIFEST_DIR").unwrap();
    let meta = MetadataCommand::new()
        .manifest_path("./Cargo.toml")
        .current_dir(&path)
        .exec()
        .unwrap();
    
    let root = meta.root_package().unwrap();
    let option = root.metadata["my"]["option"].as_str().unwrap();
    let version = &root.version;
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-15
      • 1970-01-01
      • 2022-06-17
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多