একটি বিকল্প সমাধান হ'ল উভয় জিনিসকে একটি প্যাকেজের মধ্যে ক্র্যাম করার চেষ্টা না করা। বন্ধুত্বপূর্ণ এক্সিকিউটেবলের সাথে সামান্য বড় প্রকল্পগুলির জন্য, আমি একটি ওয়ার্কস্পেস ব্যবহার করে খুব সুন্দর পেয়েছি
আমরা একটি বাইনারি প্রকল্প তৈরি করি যা এর ভিতরে একটি লাইব্রেরি অন্তর্ভুক্ত করে:
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
ডিরেক্টরি পরিচালনা করি তবে গ্রন্থাগারটি দু'বার নির্মিত হবে না - এটি উভয় প্রকল্পের মধ্যে ভাগ করা আছে।