एक वैकल्पिक समाधान वास्तव में दोनों चीजों को एक पैकेज में रटना करने की कोशिश नहीं करना है। एक दोस्ताना निष्पादन के साथ थोड़ी बड़ी परियोजनाओं के लिए, मैंने कार्यक्षेत्र का उपयोग करना बहुत अच्छा पाया है
हम एक बाइनरी प्रोजेक्ट बनाते हैं जिसमें इसके अंदर एक लाइब्रेरी शामिल है:
the-binary
├── Cargo.lock
├── Cargo.toml
├── mylibrary
│ ├── Cargo.toml
│ └── src
│ └── lib.rs
└── src
└── main.rs
Cargo.toml
यह [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