为什么 clap 添加到 Cargo.toml 后编译失败?
Why does clap fail to compile when added to Cargo.toml?
总结
我对 Rust 还很陌生,因此决定使用它来将现有项目移植到其中。我打算使用 clap
来处理 CLI 选项,但我不断收到错误。
我需要做什么才能 clap
正确安装,以便它可以在我的项目中作为依赖项使用(例如 extern crate clap; [...] use clap::App; [...]
?
我还没有遇到其他板条箱的问题(到目前为止),所以我不确定这里有什么不同或者板条箱本身是否有问题。
我已经看到了一些问题(例如 ),这只是建议将依赖项添加到 .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 本身的自述文件,只需添加它 应该 工作:
For full usage, add clap as a dependency in your Cargo.toml to use from crates.io:
[dependencies]
clap = "~2.33"
但事实并非如此。
我已经尝试过使用和不使用 ~
前缀以及 clap = {version = "2.33", features = ["yaml"]}
,这也在回购协议中显示,但没有成功。 (是的,我正在尝试从 .yaml
文件加载 CLI 选项。)
从 shell 尝试 cargo install clap --version 2.33.0
只是 returns 一条错误消息说: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 停止将所有内容标记为错误,则奖励:
货运安装
对cargo install
命令有误解。您可以了解更多 here.
This command manages Cargo’s local set of installed binary crates. Only packages which have executable [[bin]]
or [[example]]
targets can be installed, and all executables are installed into the installation root’s bin
folder.
这不是你的情况。您唯一需要做的就是在 dependencies
部分 (Cargo.toml
) 中列出 clap
。就这样。根本不需要使用 cargo install
。 cargo build
、cargo run
、...命令将下载和编译并静态 link 所有依赖项。
一个例子
文件夹结构:
.
├── Cargo.toml
└── src
├── cli.yaml
└── main.rs
当前目录:
$ pwd
/Users/robertvojta/Projects/Whosebug/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: Whosebug 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代码
I still have vscode complaining and underlining everything in red in the Cargo.toml
file. Any suggestions to fix this completely? It seems close to a full resolution.
我可以确认这个问题确实存在于 Rust 1.34.0 中。我确实安装了这个版本,但我有同样的症状:
- 无法编译 clap
- 整个
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。
我刚刚测试了这两种方式并且它有效。
相关问题:
总结
我对 Rust 还很陌生,因此决定使用它来将现有项目移植到其中。我打算使用 clap
来处理 CLI 选项,但我不断收到错误。
我需要做什么才能 clap
正确安装,以便它可以在我的项目中作为依赖项使用(例如 extern crate clap; [...] use clap::App; [...]
?
我还没有遇到其他板条箱的问题(到目前为止),所以我不确定这里有什么不同或者板条箱本身是否有问题。
我已经看到了一些问题(例如 .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 本身的自述文件,只需添加它 应该 工作:
For full usage, add clap as a dependency in your Cargo.toml to use from crates.io:
[dependencies] clap = "~2.33"
但事实并非如此。
我已经尝试过使用和不使用 ~
前缀以及 clap = {version = "2.33", features = ["yaml"]}
,这也在回购协议中显示,但没有成功。 (是的,我正在尝试从 .yaml
文件加载 CLI 选项。)
从 shell 尝试 cargo install clap --version 2.33.0
只是 returns 一条错误消息说: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 停止将所有内容标记为错误,则奖励:
货运安装
对cargo install
命令有误解。您可以了解更多 here.
This command manages Cargo’s local set of installed binary crates. Only packages which have executable
[[bin]]
or[[example]]
targets can be installed, and all executables are installed into the installation root’sbin
folder.
这不是你的情况。您唯一需要做的就是在 dependencies
部分 (Cargo.toml
) 中列出 clap
。就这样。根本不需要使用 cargo install
。 cargo build
、cargo run
、...命令将下载和编译并静态 link 所有依赖项。
一个例子
文件夹结构:
.
├── Cargo.toml
└── src
├── cli.yaml
└── main.rs
当前目录:
$ pwd
/Users/robertvojta/Projects/Whosebug/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: Whosebug 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代码
I still have vscode complaining and underlining everything in red in the
Cargo.toml
file. Any suggestions to fix this completely? It seems close to a full resolution.
我可以确认这个问题确实存在于 Rust 1.34.0 中。我确实安装了这个版本,但我有同样的症状:
- 无法编译 clap
- 整个
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。
我刚刚测试了这两种方式并且它有效。
相关问题: