繁体   English   中英

如何将版本信息从 Vergen 传递到 StructOpt?

[英]How can I pass version information from Vergen to StructOpt?

我正在尝试在 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"));
}

可惜! 尽管记录了这种语法,但它在尝试构建时会引发解析错误:

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 检测到的版本?

手册中的[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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM