如何将版本信息从 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"));
}
可惜啊!尽管有这种语法 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 检测到的版本?
手册中的[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 中设置一个简单的 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 检测到的版本?
手册中的[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