让我们从头开始。看一下The Cargo Book中的Package Layout章节。如您所见,您的包可以包含很多内容:
- 一个二进制文件(可运行的东西)或多个二进制文件,
- 一个库(共享代码),
- 示例(s),
- 基准测试(s),
- 集成测试。
包布局
这里没有列出所有可能性,只有二进制/库组合。
一个二进制文件
这是一个具有单个二进制文件的包的示例。入口点是src/main.rs
中的main
函数。
Cargo.toml
:
[package]
name = "hallo"
version = "0.1.0"
edition = "2018"
src/main.rs
:
fn main() {
println!("Hallo, Rust here!")
}
$ cargo run
Hallo, Rust here!
一个库
这是一个带有库的包示例。库没有入口点,无法运行。它们用于功能共享。
Cargo.toml
:
[package]
name = "hallo"
version = "0.1.0"
edition = "2018"
src/lib.rs
:
pub fn foo() {
println!("Hallo, Rust library here!")
}
$ cargo run
error: a bin target must be available for `cargo run`
你在 Cargo.toml
文件中看到了关于二进制文件或库的信息吗?没有。原因是我遵循了Package Layout,cargo
知道在哪里寻找东西。
二进制和库
这是一个包含二进制文件和库的示例。
Cargo.toml
:
[package]
name = "hallo"
version = "0.1.0"
edition = "2018"
src/lib.rs
:
pub const GREETING: &'static str = "Hallo, Rust library here!";
src/main.rs
:
use hallo::GREETING;
fn main() {
println!("{}", GREETING);
}
同样的问题,你在 Cargo.toml
文件中有没有看到任何关于二进制或库的内容? 没有。
这个包含两个东西:
- 一个二进制文件(根目录为
src/main.rs
,入口点为 src/main.rs::main
), - 一个库(根目录为
src/lib.rs
,共享代码)。
一个库可以通过 use hallo::...
从二进制文件中引用,其中 hallo
是这个包的名称(Cargo.toml
-> [package]
-> name
)。
你的问题
Cargo.toml
:
[package]
name = "hallo"
version = "0.1.0"
edition = "2018"
相同的包布局
库部分
src/lib.rs
:
pub mod bar;
pub mod foo;
src/foo.rs
:
pub fn say_foo() {
println!("Foo");
}
src/bar.rs
:
use crate::foo;
pub fn bar() {
foo::say_foo();
}
crate
指的是src/lib.rs
,因为我们在这里的上下文是库。
将其视为一个独立的单元,并通过外部使用use hallo::...;
来引用它。
二进制部分
src/main.rs
:
use hallo::bar::bar;
fn main() {
bar();
}
这里我们只是在使用我们的库。
没有库
相同的代码,但将lib.rs
重命名为utils.rs
,并将(foo|bar).rs
文件移动到src/utils/
文件夹中。
src/utils.rs
:
pub mod bar;
pub mod foo;
src/utils/foo.rs
:
pub fn say_foo() {
println!("Foo");
}
src/utils/bar.rs
:
use super::foo;
pub fn bar() {
foo::say_foo();
}
我们也可以在这里使用
crate
,但因为我们处于二进制文件的上下文中,所以路径不同。
src/main.rs
:
use utils::bar::bar;
mod utils;
fn main() {
bar();
}
在这里,我们只是声明了另一个模块(utils
)并使用它。
摘要
Cargo.toml
内容:
[package]
name = "hallo"
version = "0.1.0"
edition = "2018"
如果有一个src/main.rs
文件,你基本上是在说这个:
[package]
name = "hallo"
version = "0.1.0"
edition = "2018"
[[bin]]
name = "hallo"
src = "src/main.rs"
如果有一个src/lib.rs
文件,基本上您是在说:
[package]
name = "hallo"
version = "0.1.0"
edition = "2018"
[lib]
name = "hallo"
path = "src/lib.rs"
如果两者都存在,你基本上是在说这个:
[package]
name = "hallo"
version = "0.1.0"
edition = "2018"
[[bin]]
name = "hallo"
path = "src/main.rs"
[lib]
name = "hallo"
path = "src/lib.rs"
文档
Cargo.toml
里有什么?你在一个项目中同时拥有 库和二进制文件 吗?看起来你有点混淆了。 - zrzka