在单独的文件中定义时,structopt 无法找到其 Args 解析器

structopt unable to find its Args parser when defined in a separate file

我开始使用 Rust 中的命令行工具,但从一开始就碰壁了。如果在 main.rs 中定义了 Opt 结构,我可以使用 StructOpt 解析命令行参数,但是因为我希望能够将 Opt 结构传递到库代码中,我在它自己的文件中定义它,以便库的其他部分知道它的全部内容。

这是转储错误最少的代码版本,尽管我承认它在很大程度上是通过尝试编译器建议的内容和一些随机的 SO 建议拼凑而成的,因此它可能 完全错了。

我得到的构建错误是:

$ cargo run
   Compiling basic v0.1.0 (/home/mpalmer/src/action-validator/blobble)
error[E0433]: failed to resolve: maybe a missing crate `structopt`?
 --> src/opt.rs:8:5
  |
8 |     /// Activate debug mode
  |     ^^^^^^^^^^^^^^^^^^^^^^^ not found in `structopt::clap`
  |
help: consider importing this struct
  |
3 | use opt::structopt::clap::Arg;
  |

For more information about this error, try `rustc --explain E0433`.
error: could not compile `basic` due to previous error
$ cargo --version
cargo 1.56.0 (4ed5d137b 2021-10-04)
$ rustc --version
rustc 1.56.0 (09c42c458 2021-10-18)

(是的,我 已经 尝试添加 use opt::structopt::clap::Arg;,以防万一,但错误并没有消失,我收到有关未使用的导入的警告 - - 虽然仍然被告知尝试添加未使用的相同 use,这很有趣)

Cargo.toml

[package]
name = "basic"
version = "0.1.0"
authors = ["User"]

[dependencies]
structopt = "0.3"

src/main.rs

extern crate basic;
extern crate structopt;

use basic::Opt;
use structopt::StructOpt;

fn main() {
    let opt = Opt::from_args();
    println!("{:#?}", opt)
}

src/lib.rs

mod opt;

pub use crate::opt::Opt;

src/opt.ts

extern crate structopt;

use self::structopt::StructOpt;

#[derive(StructOpt, Debug)]
#[structopt(name = "basic")]
pub struct Opt {
    /// Activate debug mode
    #[structopt(short,long)]
    debug: bool,
}

非常感谢建议。

工作版本是

Cargo.toml

[package]
name = "basic"
version = "0.1.0"
authors = ["User"]
edition = "2018"

[dependencies]
structopt = "0.3"

lib.rs

#[macro_use] extern crate structopt;
use structopt::StructOpt;

pub mod opt;

opt.rs

#[derive(StructOpt, Debug)]
#[structopt(name = "basic")]
pub struct Opt {
    /// Activate debug mode
    #[structopt(short,long)]
    debug: bool,
}

main.rs

#[macro_use] extern crate structopt;
use structopt::StructOpt;

fn main() {
    let opt = basic::opt::Opt::from_args();
    println!("{:#?}", opt);
}

您需要声明 use structopt::StructOpt 因为 from_args 特征必须在范围内。