【问题标题】:How can I pass version information from Vergen to StructOpt?如何将版本信息从 Vergen 传递到 StructOpt?
【发布时间】:2020-04-17 21:42:19
【问题描述】:

我正在尝试在 Rust 中设置一个简单的 CLI 程序,但我希望它根据 git describe 中的信息显示版本,而不是 Cargo.toml 文件中的任何内容。

我设置了一些基本的依赖项:

[dependencies]
structopt = "0.3.13"

[build-dependencies]
vergen = "3.1.0"

一个 build.rs 文件用 vergen 来完成:

extern crate vergen;

use vergen::{ConstantsFlags, generate_cargo_keys};

fn main() {
    // Setup the flags, toggling off the 'SEMVER_FROM_CARGO_PKG' flag
    let mut flags = ConstantsFlags::all();
    flags.toggle(ConstantsFlags::SEMVER_FROM_CARGO_PKG);

    // Generate the 'cargo:' key output
    generate_cargo_keys(flags).expect("Unable to generate the cargo keys!");
}

结果是一组可从我的 main.rs 中使用的环境变量:

fn main() {
    println!("Build SHA: {}", env!("VERGEN_SHA_SHORT"));
}

这会打印出我构建的正确 git SHA。问题是我不知道如何让 StruckOpt 使用生成的版本。我本来希望这样的事情能奏效:

use structopt::StructOpt;

/// A thing
#[derive(StructOpt)]
struct Cli {
    version: [ version = env!("VERGEN_SEMVER") ],
}

fn main() {
    let args = Cli::from_args();
    println!("Build SHA: {}", env!("VERGEN_SHA_SHORT"));
}

但是,唉!尽管有这种语法being documented,但它在尝试构建时会引发解析错误:

error: expected one of `!`, `(`, `+`, `::`, `;`, `<`, or `]`, found `=`
 --> src/main.rs:6:24
  |
6 |     version: [ version = env!("VERGEN_SEMVER") ],
  |                        ^ expected one of 7 possible tokens

什么给了?如何使用 StructOpt 设置我的 CLI,以便 --version 将报告 vergen 检测到的版本?

【问题讨论】:

    标签: rust command-line-interface structopt


    【解决方案1】:

    手册中的[version = "version"]符号表示我们需要写#[structopt(version = "version")]来指定版本号的字符串:

    $ cat src/main.rs
    use structopt::StructOpt;
    
    #[derive(StructOpt)]
    #[structopt(version = env!("VERGEN_SEMVER"))]
    struct Cli {}
    
    fn main() {
        let _cli = Cli::from_args();
    }
    
    $ env VERGEN_SEMVER=v1.2.3 cargo build
    ...
    
    $ cargo run -- --version
        Finished dev [unoptimized + debuginfo] target(s) in 0.02s
         Running `target/debug/foo --version`
    foo v1.2.3
    

    【讨论】:

    • 谢谢!作为一个 Rust 初学者,这在文档中所以并不明显!
    猜你喜欢
    • 2018-04-13
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    相关资源
    最近更新 更多