Как передать информацию о версии из Vergen в StructOpt? - PullRequest
1 голос
/ 18 апреля 2020

Я пытаюсь настроить простую программу на CLI в Rust, но я хочу, чтобы она отображала версию, основанную на информации в git describe, а не на том, что это - файл Car go .toml.

Я устанавливаю некоторые базовые c зависимости:

[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!");
}

В результате получается набор переменных env, которые можно использовать от моего 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

Что дает? Как настроить CLI с помощью StructOpt таким образом, чтобы --version сообщал о версии, обнаруженной vergen?

1 Ответ

2 голосов
/ 23 апреля 2020

Обозначение [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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...