如何将Vergen的版本信息传递给StructOpt?

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

我想在Rust中设置一个简单的CLI程序,但我想让它根据在 git describe 而不是什么Cargo.toml文件。

我设置了一些基本的依赖关系。

[dependencies]
structopt = "0.3.13"

[build-dependencies]
vergen = "3.1.0"

然后用vergen做了一个build.rs的文件

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中使用的env变量。

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

这将打印出正确的git SHA,我从那里构建的。问题是我不知道如何让 StruckOpt 使用生成的版本。我本以为这样的东西会起作用的,但很可惜!尽管如此,我还是不知道如何让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"));
}

但可惜的是,尽管有这样的句法 被记录它抛出一个解析错误,试图构建。

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个回答
2
投票

[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
© www.soinside.com 2019 - 2024. All rights reserved.