2

我使用 YAML 文件来定义我的命令行界面。我使用 Clap 的宏解析文件load_yaml!,这在一段时间内运行良好:

#[macro_use]
extern crate clap;
use clap::{App, ArgMatches};

fn main() {
    let yml = load_yaml!("cl_arguments.yml");
    let matches = App::from_yaml(yml).get_matches();
    # some code goes here
}

如果我不对相关代码进行任何更改,这将停止工作,并且我收到以下错误:

thread 'main' panicked at 'failed to convert YAML String("1") value to a string',
/home/me/.cargo/registry/src/github.com-1ecc6299db9ec823/clap-2.31.2/src/args/arg.rs:112:28

我不确定更新是否应归咎于此。我更新了 Rust 并删除了 Cargo.lock 以排除不兼容问题,但这并没有帮助。

这是我的 YAML 文件的最小版本,它会产生错误:

name: "tool"
version: "0.1"
about: "description"
author: "m00am"

subcommands:
  - subcommand1:
      args:
        - path:
            index: "1"
            required: true
            default_value: "/tmp/"
            help: "Dummy Path"
  - subcommand2:
      args:
         - other_path:
             index: "1"
             required: true
             help: "A second dummy path"

这是一个已知的问题?这里出了什么问题?除了尝试旧版本的 Clap 和 YAML 板条箱的组合之外,我还能做些什么吗?

版本信息

摘自 Cargo.toml

[dependencies]
rand = "*"
cute = "0.3.0"
fasthash = "*"
bio = "*"
rulinalg = "*"
serde = "*"
serde_derive = "*"
bincode = "*"
statrs = "*"
separator = "*"
termion = "*"
sysinfo = "*"
clap = { version = "*", features = ["yaml"] }
needletail = "*"
gnuplot = "*"
time = "*"
cue = "*"

摘自 Cargo.lock

[[package]]
name = "clap"
version = "2.31.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "atty 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "yaml-rust 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
]

...

[[package]]
name = "yaml-rust"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
4

1 回答 1

5

参数规范的index属性应该是整数,而不是字符串。可以在文档中找到具有显式索引的位置参数的示例。删除该值周围的引号,配置文件将再次起作用。

name: "tool"
version: "0.1"
about: "description"
author: "m00am"

subcommands:
  - subcommand1:
      args:
        - path:
            index: 1
            required: true
            default_value: "/tmp/"
            help: "Dummy Path"
  - subcommand2:
      args:
         - other_path:
             index: 1
             required: true
             help: "A second dummy path"
$ cargo run -- subcommand1 --help

USAGE:
    tool subcommand1 <path>

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

ARGS:
    <path>    Dummy Path [default: /tmp/]

我无法确定这曾经在以前的版本中起作用的原因。实施有可能允许它超出预期的功能。否则,它可能是与早期版本的 Clap 相比具有 YAML 配置支持的重大变化。Cargo.toml 文件中的依赖项对于长期使用来说过于灵活,并且使这些问题更有可能发生。坚持默认(插入符号)版本范围通常是正确的做法(请参阅指定依赖项)。

于 2018-04-20T13:53:45.600 回答