Rust use of undeclared crate or module和maybe a missing crate?

对于新手Ruster来说,最绝望的就是crate找不到了,use of undeclared crate or modulemaybe a missing crate?

use of undeclared crate or module

在workspace方式组织的项目中,遇到了

error[E0433]: failed to resolve: use of undeclared crate or module db_schema
–> main/src/main.rs:2:9
|
2 | use db_schema::strategy::todolist;
| ^^^^^^^^^ use of undeclared crate or module db_schema

工程组织目录如下:
有三个package,分别是main、dao/db_schema和dao/db_queries

[workspace]
members = [
  "main",
  "dao/db_schema",
   "dao/db_queries"
]

在这里插入图片描述

在main的Cargo.toml文件里,已经写明db_schema和db_queries的依赖:

[dependencies]
diesel = { version = "1.4.6", features = ["mysql", "chrono", "bigdecimal"] }
dotenv = "0.15.0"
chrono = { version = "0.4.19", features = ["serde"] }
bigdecimal = "*"
db_schema =    { path = "../dao/db_schema"}
db_queries =  { path = "../dao/db_queries"}

并且在lib.rs中指明了

pub mod strategy;
pub mod config;
pub mod schema;

在mod.rs里:

pub mod the_masked_one;
pub mod todolist;

但是在根目录下运行cargo build时报错

use of undeclared crate or module db_schema

根据官方文档:
https://doc.rust-lang.org/book/ch14-03-cargo-workspaces.html
入门级

https://doc.rust-lang.org/cargo/reference/workspaces.html
更特别

并且自己又写了个测试工程(只包含main和schema),正当绝望时,在workspace的Cargo.toml里,加上db_schema作为依赖,搞定。现在workspace级别的Cargo.toml:

[package]
name = "lucky"
version = "0.0.1"
edition = "2018"

[workspace]
members = [
    "main",
    "dao/db_schema",
     "dao/db_queries"
 ]

[[bin]]
name = "luckyapp"
path = "main/src/main.rs"

[dependencies]
db_schema =    { path = "./dao/db_schema"} // 这里,成功解决了问题
db_queries =  { path = "./dao/db_queries"}

但是我的测试工程就不需要这两句。测试工程的Cargo.toml

[workspace]
members = [
    "maina",
    "dao/schema",
]

对比后发现,问题出在workspace的Cargo.toml上。如果在这个Cargo.toml里加上[package][[bin]]标签([package]编译提示必须要有[[bin]]),就必须加上[dependencies]标签,并且把main.rs用到的所有依赖写在这里,相当于main.rs自己所在的package被workspace级别的Cargo.toml override了。即使main.rs所在package的Cargo.toml的dependency完美,也不行。

maybe a missing crate?

error[E0432]: unresolved import crate::schema
–> dao\db_schema\src\strategy\todolist.rs:16:12
|
16 | use crate::schema::todo_list;
| ^^^^^^ maybe a missing crate schema?

原因,在db_schema这个package的lib.rs里,我虽然写上了所有lib.rs的晚辈,但是唯独把它姐妹schema.rs漏掉了,所以加上:

pub mod strategy;
pub mod config;
pub mod schema;  // 一开始漏掉了这句

其他的情况,见解答:
https://stackoverflow.com/questions/61849216/including-an-internal-module-produces-maybe-a-missing-crate-module2
总结就是,外部要使用的模块需要声明,在每个模块目录的mod.rs里,lib.rs对于package的作用就像mod.rs。

.
├── config
│   └── mod.rs
├── lib.rs
├── schema.rs
└── strategy
    ├── mod.rs
    └── todolist.rs

2 directories, 5 files
$ cat config/mod.rs
$ cat strategy/mod.rs
pub mod todolist;
$ cat lib.rs
pub mod strategy; // 目录
pub mod config;   // 目录
pub mod schema;   // schema.rs
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值