~/rust/first
src
│ app
│ │ src
│ │ │ lib.rs
│ │ └ entry.rs E
│ └ Cargo.toml
└ main.rs E
Cargo.lock
Cargo.toml
这是我用 Rust 建立的第一个项目。
struct Entry{}
中有一个src/app/src/entry.rs
。
顶级 Cargo.toml
在其 members = ["src/app"]
部分列出了 [workspace]
。
app
级别 Cargo.toml
定义 [package]name="app"
。
在顶层
main.rs
我只有let app = app::Entry::new();
,但编译器说“使用未声明的板条箱或模块app
”。
为什么在子目录中声明包“app”,然后将其定义为顶层工作区中的成员,不足以让
Entry
在顶层 main.rs 中看到?
如果我将
app = { path = "./src/app" }
添加到 dependencies
部分,那么它就可以工作。
但那为什么要有工作区成员呢?
我错过了什么?
A workspace 是一个或多个包的集合,称为 工作区成员,一起管理。
工作空间的要点是:
- 常用命令可以在所有工作区成员上运行,例如
。cargo check --workspace
- 所有包共享一个通用的
文件,该文件位于 工作空间根中。Cargo.lock
- 所有包共享一个公共的输出目录,默认为
工作空间根中名为target
的目录。- 共享包元数据,例如
。workspace.package
[patch]
中的[replace]
、[profile.*]
和Cargo.toml
部分仅 在 root 清单中被识别,并在成员箱中被忽略 体现出来。
-- https://doc.rust-lang.org/stable/cargo/reference/workspaces.html
工作区成员不会自动相互依赖。这实际上是不可能的,因为这意味着板条箱之间存在循环依赖关系。