परिचय: Rust में मोनोरेपॉजिटरी की आवश्यकता क्यों है?
\n\nजब आप Rust सीखना शुरू करते हैं, तो सबसे पहले आपका सामना cargo new के माध्यम से बनाई गई एक एकल परियोजना से होता है। लेकिन जब आपकी परियोजना बढ़ती है तो क्या करें: साझा लाइब्रेरी सामने आती हैं, कई निष्पादन योग्य फ़ाइलें (जैसे, सर्वर और क्लाइंट) होती हैं, या आप दोहराए जाने वाले कोड को एक अलग पैकेज में निकालना चाहते हैं?
यहाँ मोनोरेपॉजिटरी (monorepo) मदद करता है — यह एक दृष्टिकोण है जिसमें कई परस्पर संबंधित परियोजनाओं (लाइब्रेरी और निष्पादन योग्य फ़ाइलों) का कोड एक ही रिपॉजिटरी में संग्रहीत किया जाता है। Rust इसके लिए एक अंतर्निहित समाधान प्रदान करता है — Cargo Workspaces (कार्यक्षेत्र)।
\n\nइस लेख में, हम समझेंगे कि Rust में मोनोरेपॉजिटरी को शुरू से कैसे व्यवस्थित किया जाए: फ़ोल्डर संरचना से लेकर व्यावहारिक उदाहरणों तक। आप सीखेंगे कि कोड को मॉड्यूल में ठीक से कैसे विभाजित किया जाए, स्थानीय निर्भरताओं को कैसे जोड़ा जाए और बिल्ड का प्रबंधन कैसे किया जाए।
\n\n1. Cargo Workspace क्या है और इसे कैसे बनाएं?
\n\nकार्यक्षेत्र (workspace) क्रेट्स (crates) का एक सेट है जो एक ही Cargo.lock फ़ाइल और एक सामान्य target निर्देशिका का उपयोग करता है। यह निर्भरता संस्करणों के टकराव से बचाता है और संकलन को गति देता है।
मोनोरेपॉजिटरी संरचना बनाना
\n\nआइए दो क्रेट्स के साथ एक सरल मोनोरेपॉजिटरी बनाएं: एक utils लाइब्रेरी और एक app निष्पादन योग्य फ़ाइल।
mkdir my_monorepo\ncd my_monorepo\ncargo new utils --lib\ncargo new app\n\n\nअब एक रूट Cargo.toml फ़ाइल बनाएं जो workspace घोषित करेगी:
[workspace]\nmembers = [\n "utils",\n "app",\n]\n\n\nमहत्वपूर्ण: सुनिश्चित करें कि utils/Cargo.toml और app/Cargo.toml फ़ाइलों में workspace फ़ील्ड के साथ कोई [package] अनुभाग नहीं है — इसकी आवश्यकता नहीं है। Cargo स्वयं समझ जाएगा कि यह workspace का हिस्सा है।
प्रोजेक्ट संरचना
\n\nबनाने के बाद, आपको इस प्रकार की संरचना मिलेगी:
\n\nmy_monorepo/\n├── Cargo.toml # रूट workspace\n├── utils/\n│ ├── Cargo.toml\n│ └── src/\n│ └── lib.rs\n└── app/\n ├── Cargo.toml\n └── src/\n └── main.rs\n\n\n2. कोड संगठन: लाइब्रेरी और मॉड्यूल
\n\nअब utils लाइब्रेरी में कोड जोड़ें। मान लीजिए, हम संख्याओं और स्ट्रिंग्स के साथ काम करने के लिए सामान्य फ़ंक्शन बनाना चाहते हैं।
लाइब्रेरी कोड (utils/src/lib.rs)
\n\npub mod math;\npub mod strings;\n\n\nमॉड्यूल फ़ाइलें बनाएं:
\n\n// utils/src/math.rs\npub fn add(a: i32, b: i32) -> i32 {\n a + b\n}\n\npub fn multiply(a: i32, b: i32) -> i32 {\n a * b\n}\n\n\n// utils/src/strings.rs\npub fn greet(name: &str) -> String {\n format!("नमस्ते, {}!", name)\n}\n\npub fn to_uppercase(text: &str) -> String {\n text.to_uppercase()\n}\n\n\nनिष्पादन योग्य फ़ाइल में लाइब्रेरी जोड़ना
\n\napp/Cargo.toml फ़ाइल में, स्थानीय क्रेट पर निर्भरता निर्दिष्ट करें:
[package]\nname = "app"\nversion = "0.1.0"\nedition = "2021"\n\n[dependencies]\nutils = { path = "../utils" }\n\n\nअब app/src/main.rs में हम utils के फ़ंक्शन का उपयोग कर सकते हैं:
use utils::math;\nuse utils::strings;\n\nfn main() {\n let sum = math::add(5, 10);\n println!("5 + 10 = {}", sum);\n\n let greeting = strings::greet("दुनिया");\n println!("{}", greeting);\n\n let upper = strings::to_uppercase("rust rocks");\n println!("{}", upper);\n}\n\n\nमोनोरेपॉजिटरी की रूट से कमांड के साथ प्रोजेक्ट चलाएं:
\n\ncargo run -p app\n\n\nआप आउटपुट देखेंगे:
\n\n5 + 10 = 15\nनमस्ते, दुनिया!\nRUST ROCKS\n\n\n3. विस्तारित संगठन: कई निष्पादन योग्य फ़ाइलें
\n\nअक्सर मोनोरेपॉजिटरी में कई