Я пытаюсь настроить простую программу на 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?