我想做一个Rust包,既包含可重用库(其中大部分程序是实现的),也包含使用它的可执行文件。
假设我没有混淆Rust模块系统中的任何语义,我的Cargo.toml文件应该是什么样子?
Cargo.toml
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(); }
创建一个src/main.rs,它将被用作事实上的可执行文件。你不需要修改你的Cargo.toml,这个文件将被编译成与库同名的二进制文件。
src/main.rs
项目内容:
% tree . ├── Cargo.toml └── src ├── lib.rs └── main.rs
[package] name = "example" version = "0.1.0" edition = "2018"
src / lib.rs
use std::error::Error; pub fn really_complicated_code(a: u8, b: u8) -> Result<u8, Box<dyn Error>> { Ok(a + b) }
src / main.rs
fn main() { println!( "I'm using the library: {:?}", example::really_complicated_code(1, 2) ); }
并执行它:
% cargo run -q I'm using the library: Ok(3)
如果你想控制二进制文件的名称或有多个二进制文件,你可以在src/bin中创建多个二进制源文件,在src中创建其余的库源文件。你可以在我的项目中看到一个例子。你根本不需要修改你的Cargo.toml,并且src/bin中的每个源文件将被编译成同名的二进制文件。
src/bin
src
% tree . ├── Cargo.toml └── src ├── bin │ └── mybin.rs └── lib.rs
src / bin / mybin.rs
% cargo run --bin mybin -q I'm using the library: Ok(3)
参见:
你可以把lib.rs和main.rs一起放到sources文件夹中。没有冲突和cargo将建立这两个东西。
lib.rs
main.rs
为了解决文档冲突,在Cargo.toml中添加:
[[bin]] name = "main" doc = false
另一个解决方案是不要试图把这两件事塞进一个包里。对于具有友好可执行文件的稍微大一些的项目,我发现使用工作空间非常好。
在这里,我创建了一个二进制项目,其中包括一个库,但有许多可能的方式来组织代码:
% tree the-binary the-binary ├── Cargo.toml ├── src │ └── main.rs └── the-library ├── Cargo.toml └── src └── lib.rs
它使用[workspace]键,并取决于标准库:
[workspace]
[package] name = "the-binary" version = "0.1.0" edition = "2018" [workspace] [dependencies] the-library = { path = "the-library" }
fn main() { println!( "I'm using the library: {:?}", the_library::really_complicated_code(1, 2) ); }
图书馆/ Cargo.toml
[package] name = "the-library" version = "0.1.0" edition = "2018"
图书馆/ src / lib.rs
这个方案有两大好处:
工作空间防止每个组件的冗余构建。如果我们在the-library和the-binary目录中同时运行cargo build,库将不会两次构建—它在两个项目之间共享。
the-library
the-binary
cargo build