为什么 clap 添加到 Cargo.toml 时无法编译?

cod*_*edd 2 rust rust-crates rust-cargo

概括

\n\n

我对 Rust 相当陌生,并决定使用它将现有项目移植到其中。我打算使用clap来处理 CLI 选项,但我不断收到错误。

\n\n

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

\n\n

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

\n\n

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

\n\n

我使用的是 Ubuntu Linux,如果这有什么区别的话。

\n\n

我尝试过的

\n\n

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

\n\n
{\n    "resource": "[...]/Projects/takeout/Cargo.toml",\n    "owner": "rust",\n    "severity": 8,\n    "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)",\n    "startLineNumber": 1,\n    "startColumn": 1,\n    "endLineNumber": 10000,\n    "endColumn": 1\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

根据clap 存储库本身中的自述文件,只需添加它就应该可以工作:

\n\n
\n

要完整使用,请在 Cargo.toml 中添加 clap 作为依赖项,以便从 crates.io 使用:

\n\n
[dependencies]\nclap = "~2.33"\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

但事实并非如此。

\n\n

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

\n\n

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

\n\n

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

\n\n
cargo install --git https://github.com/clap-rs/clap.git --tag v2.31.2 --features yaml                                                  101 \xe2\x86\xb5\n    Updating git repository `https://github.com/clap-rs/clap.git`\n  Installing clap v2.31.2 (https://github.com/clap-rs/clap.git?tag=v2.31.2#07c15d28)\nerror: specified package has no binaries\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\n\n

如果您知道如何让 VSCode 停止将所有内容标记为错误,那就太好了:

\n\n

VSCode 将所有内容标记为错误

\n

zrz*_*zka 5

货物安装

\n\n

对命令存在误解cargo install您可以在这里了解更多信息

\n\n
\n

此命令管理 Cargo\xe2\x80\x99s 已安装的二进制 crate 的本地集。只能安装具有可执行文件[[bin]]或目标的软件包,所有可执行文件都安装到安装根\xe2\x80\x99s中[[example]]bin文件夹中。

\n
\n\n

这不是你的情况。您唯一需要做的就是clapdependencies( Cargo.toml) 部分中列出。就这样。cargo install根本不需要使用。cargo build,cargo run , ... 命令将下载并编译并静态链接所有依赖项。

\n\n

一个例子

\n\n

文件夹结构:

\n\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Cargo.toml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n \xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 cli.yaml\n \xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.rs\n
Run Code Online (Sandbox Code Playgroud)\n\n

当前目录:

\n\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Cargo.toml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n \xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 cli.yaml\n \xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.rs\n
Run Code Online (Sandbox Code Playgroud)\n\n

Cargo.toml内容:

\n\n
[package]\nname = "clap-yaml"\nversion = "0.1.0"\nauthors = ["Zrzka"]\nedition = "2018"\n\n[dependencies]\nclap = { version = "2.33.0", features = ["yaml"] }\n
Run Code Online (Sandbox Code Playgroud)\n\n

src/cli.yaml内容:

\n\n
name: clap-yaml\nversion: "1.0"\nauthor: Zrzka\nabout: Stackoverflow sample\nargs:\n  - lang:\n      short: l\n      long: lang\n      default_value: cz\n      takes_value: true\n      possible_values:\n        - cz\n        - en\n
Run Code Online (Sandbox Code Playgroud)\n\n

src/main.rs内容:

\n\n
$ pwd\n/Users/robertvojta/Projects/stackoverflow/clap-yaml\n
Run Code Online (Sandbox Code Playgroud)\n\n

运行它cargo

\n\n
[package]\nname = "clap-yaml"\nversion = "0.1.0"\nauthors = ["Zrzka"]\nedition = "2018"\n\n[dependencies]\nclap = { version = "2.33.0", features = ["yaml"] }\n
Run Code Online (Sandbox Code Playgroud)\n\n

直接运行:

\n\n
name: clap-yaml\nversion: "1.0"\nauthor: Zrzka\nabout: Stackoverflow sample\nargs:\n  - lang:\n      short: l\n      long: lang\n      default_value: cz\n      takes_value: true\n      possible_values:\n        - cz\n        - en\n
Run Code Online (Sandbox Code Playgroud)\n\n

视觉工作室代码

\n\n
\n

我仍然有 vscode 抱怨并在Cargo.toml。有什么建议可以彻底解决这个问题吗?看起来已经接近完整分辨率了。

\n
\n\n

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

\n\n
    \n
  • 无法编译拍手
  • \n
  • 整体Cargo.toml加下划线(错误)
  • \n
\n\n

有两种方法可以解决这个问题。

\n\n

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

\n\n
[dependencies]\nbitflags = "=1.0.4"\nclap = { version = "2.33.0", features = ["yaml"] }\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

我刚刚测试了两种方法并且有效。

\n\n

相关问题:

\n\n\n