如何在带有 structopt crate 的子命令后使用 CLI 参数?
How to use a CLI argument after subcommand with the structopt crate?
例如,运行 我的申请
./app --foo=bar get
效果很好,但是
./app get --foo=bar
产生错误:
error: Found argument '--foo' which wasn't expected, or isn't valid in this context
USAGE:
app --foo <foo> get
代码:
use structopt::*;
#[derive(Debug, StructOpt)]
#[structopt(name = "app")]
struct CliArgs {
#[structopt(long)]
foo: String,
#[structopt(subcommand)]
cmd: Cmd,
}
#[derive(Debug, StructOpt)]
enum Cmd {
Get,
Set,
}
fn main() {
let args = CliArgs::from_args();
println!("{:?}", args);
}
依赖关系:
structopt = { version = "0.3", features = [ "paw" ] }
paw = "1.0"
根据issue 237,有一个global
参数。没想到文档里没有提到
使用 global = true
效果很好:
use structopt::*;
#[derive(Debug, StructOpt)]
#[structopt(name = "cli")]
struct CliArgs {
#[structopt(
long,
global = true,
default_value = "")]
foo: String,
#[structopt(subcommand)]
cmd: Cmd,
}
#[derive(Debug, StructOpt)]
enum Cmd {
Get,
Set,
}
fn main() {
let args = CliArgs::from_args();
println!("{:?}", args);
}
请注意,全局参数必须是可选的或具有默认值。
您需要为每个具有参数的命令枚举变体提供另一个结构:
use structopt::*; // 0.3.8
#[derive(Debug, StructOpt)]
struct CliArgs {
#[structopt(subcommand)]
cmd: Cmd,
}
#[derive(Debug, StructOpt)]
enum Cmd {
Get(GetArgs),
Set,
}
#[derive(Debug, StructOpt)]
struct GetArgs {
#[structopt(long)]
foo: String,
}
fn main() {
let args = CliArgs::from_args();
println!("{:?}", args);
}
./target/debug/example get --foo=1
CliArgs { cmd: Get(GetArgs { foo: "1" }) }
例如,运行 我的申请
./app --foo=bar get
效果很好,但是
./app get --foo=bar
产生错误:
error: Found argument '--foo' which wasn't expected, or isn't valid in this context
USAGE:
app --foo <foo> get
代码:
use structopt::*;
#[derive(Debug, StructOpt)]
#[structopt(name = "app")]
struct CliArgs {
#[structopt(long)]
foo: String,
#[structopt(subcommand)]
cmd: Cmd,
}
#[derive(Debug, StructOpt)]
enum Cmd {
Get,
Set,
}
fn main() {
let args = CliArgs::from_args();
println!("{:?}", args);
}
依赖关系:
structopt = { version = "0.3", features = [ "paw" ] }
paw = "1.0"
根据issue 237,有一个global
参数。没想到文档里没有提到
使用 global = true
效果很好:
use structopt::*;
#[derive(Debug, StructOpt)]
#[structopt(name = "cli")]
struct CliArgs {
#[structopt(
long,
global = true,
default_value = "")]
foo: String,
#[structopt(subcommand)]
cmd: Cmd,
}
#[derive(Debug, StructOpt)]
enum Cmd {
Get,
Set,
}
fn main() {
let args = CliArgs::from_args();
println!("{:?}", args);
}
请注意,全局参数必须是可选的或具有默认值。
您需要为每个具有参数的命令枚举变体提供另一个结构:
use structopt::*; // 0.3.8
#[derive(Debug, StructOpt)]
struct CliArgs {
#[structopt(subcommand)]
cmd: Cmd,
}
#[derive(Debug, StructOpt)]
enum Cmd {
Get(GetArgs),
Set,
}
#[derive(Debug, StructOpt)]
struct GetArgs {
#[structopt(long)]
foo: String,
}
fn main() {
let args = CliArgs::from_args();
println!("{:?}", args);
}
./target/debug/example get --foo=1
CliArgs { cmd: Get(GetArgs { foo: "1" }) }