对于新手Ruster来说,最绝望的就是crate找不到了,use of undeclared crate or module和maybe 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 moduledb_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 crateschema
?
原因,在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