Answers:
Tok:tmp doug$ du -a
8 ./Cargo.toml
8 ./src/bin.rs
8 ./src/lib.rs
16 ./src
Cargo.toml:
[package]
name = "mything"
version = "0.0.1"
authors = ["me <me@gmail.com>"]
[lib]
name = "mylib"
path = "src/lib.rs"
[[bin]]
name = "mybin"
path = "src/bin.rs"
src / lib.rs:
pub fn test() {
println!("Test");
}
src / bin.rs:
extern crate mylib; // not needed since Rust edition 2018
use mylib::test;
pub fn main() {
test();
}
cargo build --verbose
,您将在rustc
命令行中看到它们。
[[bin]]
表格数组吗?为什么使用[[bin]]
而不[bin]
?似乎没有任何文档。
您也可以只将二进制源放入src/bin
,其余的源放入src
。您可以在我的项目中看到一个示例。您不需要修改您的Cargo.toml
,每个源文件都将被编译为同名的二进制文件。
然后将另一个答案的配置替换为:
$ tree
.
├── Cargo.toml
└── src
├── bin
│ └── mybin.rs
└── lib.rs
货代
[package]
name = "example"
version = "0.0.1"
authors = ["An Devloper <an.devloper@example.com>"]
src / lib.rs
use std::error::Error;
pub fn really_complicated_code(a: u8, b: u8) -> Result<u8, Box<Error>> {
Ok(a + b)
}
src / bin / mybin.rs
extern crate example; // Optional in Rust 2018
fn main() {
println!("I'm using the library: {:?}", example::really_complicated_code(1, 2));
}
并执行它:
$ cargo run --bin mybin
I'm using the library: Ok(3)
此外,您可以仅创建一个src/main.rs
将用作事实上的可执行文件。不幸的是,这与cargo doc
命令冲突:
无法记录库和二进制文件具有相同名称的软件包。考虑重命名或将目标标记为
doc = false
extern crate example;
从rust 2018开始就不需要了,您可以直接编写use example::really_complicated_code;
和使用该函数而无需命名范围
另一种解决方案是实际上不尝试将这两件事都塞进一个包中。对于具有友好可执行文件的较大项目,我发现使用工作区非常好
我们创建一个二进制项目,其中包含一个库:
the-binary
├── Cargo.lock
├── Cargo.toml
├── mylibrary
│ ├── Cargo.toml
│ └── src
│ └── lib.rs
└── src
└── main.rs
货代
这使用[workspace]
密钥并取决于库:
[package]
name = "the-binary"
version = "0.1.0"
authors = ["An Devloper <an.devloper@example.com>"]
[workspace]
[dependencies]
mylibrary = { path = "mylibrary" }
src / main.rs
extern crate mylibrary;
fn main() {
println!("I'm using the library: {:?}", mylibrary::really_complicated_code(1, 2));
}
mylibrary / src / lib.rs
use std::error::Error;
pub fn really_complicated_code(a: u8, b: u8) -> Result<u8, Box<Error>> {
Ok(a + b)
}
并执行它:
$ cargo run
Compiling mylibrary v0.1.0 (file:///private/tmp/the-binary/mylibrary)
Compiling the-binary v0.1.0 (file:///private/tmp/the-binary)
Finished dev [unoptimized + debuginfo] target(s) in 0.73 secs
Running `target/debug/the-binary`
I'm using the library: Ok(3)
该方案有两个好处:
二进制文件现在可以使用仅适用于它的依赖项。例如,您可以包括许多条板箱,以改善用户体验,例如命令行解析器或终端格式化。这些都不会“感染”该库。
工作区可防止每个组件的冗余构建。如果我们cargo build
在mylibrary
和the-binary
目录中都运行,那么库将不会同时生成-它在两个项目之间共享。
main.rs
,然后将其分解成更大的模块,最后分解成src/bin
稍微大一点的模块,然后在我开始大量重用核心逻辑时转移到工作区。
cargo test
似乎忽略了lib.rs中的单元测试
cargo test --all
您可以将lib.rs
和main.rs
放到source文件夹中。没有冲突,货物将造就这两件事。
要解决文档冲突,请添加到您的Cargo.toml
:
[[bin]]
name = "main"
doc = false