Một giải pháp thay thế là không thực sự cố gắng nhồi nhét cả hai thứ vào một gói. Đối với các dự án lớn hơn một chút với khả năng thực thi thân thiện, tôi đã thấy rất tuyệt khi sử dụng không gian làm việc
Chúng tôi tạo một dự án nhị phân bao gồm một thư viện bên trong nó:
the-binary
├── Cargo.lock
├── Cargo.toml
├── mylibrary
│ ├── Cargo.toml
│ └── src
│ └── lib.rs
└── src
└── main.rs
Vận chuyển hàng hóa
Điều này sử dụng [workspace]
khóa và phụ thuộc vào thư viện:
[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));
}
thư viện của tôi / src / lib.rs
use std::error::Error;
pub fn really_complicated_code(a: u8, b: u8) -> Result<u8, Box<Error>> {
Ok(a + b)
}
Và thực hiện nó:
$ 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)
Có hai lợi ích lớn cho chương trình này:
Hiện tại nhị phân có thể sử dụng các phụ thuộc chỉ áp dụng cho nó. Ví dụ: bạn có thể bao gồm nhiều thùng để cải thiện trải nghiệm người dùng, chẳng hạn như trình phân tích cú pháp dòng lệnh hoặc định dạng thiết bị đầu cuối. Không ai trong số này sẽ "lây nhiễm" thư viện.
Không gian làm việc ngăn chặn các bản dựng dự phòng của từng thành phần. Nếu chúng tôi chạy cargo build
trong cả thư mục mylibrary
và the-binary
thư mục, thư viện sẽ không được xây dựng cả hai lần - nó được chia sẻ giữa cả hai dự án.