为什么拍手添加到Cargo.toml后无法编译?

时间:2019-08-20 08:16:39

标签: rust rust-cargo rust-crates

摘要

我对Rust还是很陌生,因此决定使用它将现有项目移植到Rust中。我打算使用clap来处理CLI选项,但是我总是遇到错误。

我需要做什么才能正确安装clap,以便它可以作为依赖项在我的项目中使用(例如extern crate clap; [...] use clap::App; [...]

到目前为止,我还没有遇到其他箱子的问题,所以我不确定这里有什么不同,或者箱子本身是否有问题。

我已经看过几个问题(例如this one),这些问题只是建议将依赖项添加到.toml文件中,或者似乎无法为我所提供的解决方案看到。

如果有帮助,我正在使用Ubuntu Linux。

我尝试过的

clap = "2.33.0"添加到我的Cargo.toml文件中(请参见https://crates.io/crates/clap)使VSCode(通过RLS)记录以下内容:

{
    "resource": "[...]/Projects/takeout/Cargo.toml",
    "owner": "rust",
    "severity": 8,
    "message": "Could not compile `clap`.\nprocess didn't exit successfully: `[...]/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin/rls --crate-name clap [...]/.cargo/registry/src/github.com-1ecc6299db9ec823/clap-2.33.0/src/lib.rs --color never --crate-type lib --emit=dep-info,metadata -C debuginfo=2 --cfg 'feature=\"ansi_term\"' --cfg 'feature=\"atty\"' --cfg 'feature=\"color\"' --cfg 'feature=\"default\"' --cfg 'feature=\"strsim\"' --cfg 'feature=\"suggestions\"' --cfg 'feature=\"vec_map\"' -C metadata=630980a214d5fd10 -C extra-filename=-630980a214d5fd10 --out-dir [...]/Projects/takeout/target/rls/debug/deps -L dependency=[...]/Projects/takeout/target/rls/debug/deps --extern ansi_term=[...]/Projects/takeout/target/rls/debug/deps/libansi_term-1510a9addefc0253.rmeta --extern atty=[...]/Projects/takeout/target/rls/debug/deps/libatty-7c4847fd9fc1e3d9.rmeta --extern bitflags=[...]/Projects/takeout/target/rls/debug/deps/libbitflags-8369a9aec15a5abb.rmeta --extern strsim=[...]/Projects/takeout/target/rls/debug/deps/libstrsim-301d1cf239e9cd24.rmeta --extern textwrap=[...]/Projects/takeout/target/rls/debug/deps/libtextwrap-a799d71e2d028df4.rmeta --extern unicode_width=[...]/Projects/takeout/target/rls/debug/deps/libunicode_width-58e38dd9d658dcfb.rmeta --extern vec_map=[...]/Projects/takeout/target/rls/debug/deps/libvec_map-4f8e59c92e9953d8.rmeta --cap-lints allow --error-format=json --sysroot [...]/.rustup/toolchains/stable-x86_64-unknown-linux-gnu` (exit code: 101)",
    "startLineNumber": 1,
    "startColumn": 1,
    "endLineNumber": 10000,
    "endColumn": 1
}

根据clap repo本身的自述文件,只需将其添加应该即可:

  

要充分使用,请在您的Cargo.toml中添加clap作为依赖项,以供crates.io使用:

[dependencies]
clap = "~2.33"

但事实并非如此。

我尝试过使用带有和不带有~前缀以及clap = {version = "2.33", features = ["yaml"]}的前缀,它也显示在仓库中,但是没有运气。 (是的,我正在尝试从.yaml文件中加载CLI选项。)

从shell尝试cargo install clap --version 2.33.0只会返回一条错误消息:error: specified package has no binaries

直接瞄准Git存储库也会产生相同的错误消息:

cargo install --git https://github.com/clap-rs/clap.git --tag v2.31.2 --features yaml                                                  101 ↵
    Updating git repository `https://github.com/clap-rs/clap.git`
  Installing clap v2.31.2 (https://github.com/clap-rs/clap.git?tag=v2.31.2#07c15d28)
error: specified package has no binaries

请注意,在撰写本文时,Git存储库中没有v2.33.0标签。


如果您知道如何获取VSCode以停止将所有内容都标记为错误,则奖励:

VSCode marks everything as an error

1 个答案:

答案 0 :(得分:3)

货物安装

cargo install命令有误解。您可以进一步了解here

  

此命令管理Cargo在本地安装的二进制板条箱的集合。只能安装具有可执行文件[[bin]][[example]]目标的软件包,并且所有可执行文件都将安装到安装根目录的bin文件夹中。

这不是您的情况。您唯一要做的就是在clap部分(dependencies)中列出Cargo.toml。就这样。完全不需要使用cargo installcargo buildcargo run,...命令将下载并编译并静态链接所有依赖项。

一个例子

文件夹结构:

.
├── Cargo.toml
└── src
    ├── cli.yaml
    └── main.rs

当前目录:

$ pwd
/Users/robertvojta/Projects/stackoverflow/clap-yaml

Cargo.toml内容:

[package]
name = "clap-yaml"
version = "0.1.0"
authors = ["Zrzka"]
edition = "2018"

[dependencies]
clap = { version = "2.33.0", features = ["yaml"] }

src/cli.yaml内容:

name: clap-yaml
version: "1.0"
author: Zrzka
about: Stackoverflow sample
args:
  - lang:
      short: l
      long: lang
      default_value: cz
      takes_value: true
      possible_values:
        - cz
        - en

src/main.rs内容:

use clap::{App, load_yaml};

fn main() {
    let yaml = load_yaml!("cli.yaml");
    let matches = App::from_yaml(yaml).get_matches();

    match matches.value_of("lang").unwrap() {
        "cz" => println!("Ahoj"),
        "en" => println!("Hello"),
        _ => unreachable!("see possible_values in yaml, handled by clap"),
    };
}

使用cargo运行它:

$ cargo -q run -- --lang en
Hello

直接运行:

$ cargo build
    ...
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
$ target/debug/clap-yaml --lang cz
Ahoj

Visual Studio代码

  

我仍然有vscode抱怨并且在Cargo.toml文件中用红色强调所有内容。有什么建议可以彻底解决此问题吗?似乎接近完整的分辨率。

我可以确认Rust 1.34.0中确实存在此问题。我确实安装了此版本,并且出现了相同的症状:

  • 无法编译鼓掌
  • 整个Cargo.toml下划线(错误)

有两种解决方法。

如果您要坚持使用Rust 1.34.0,请手动更新Cargo.toml文件dependencies部分:

[dependencies]
bitflags = "=1.0.4"
clap = { version = "2.33.0", features = ["yaml"] }

或将您的Rust工具链更新为> = 1.35.0。

我只是同时测试了两种方法,而且都有效。

相关问题: