Rust के साथ मोनोरिपॉजिटरी: व्यवहार में कोड का संगठन
मोनोरिपॉजिटरी (monorepo) कोड प्रबंधन का एक दृष्टिकोण है, जिसमें कई प्रोजेक्ट या घटक एक ही रिपॉजिटरी में संग्रहीत होते हैं। Rust इकोसिस्टम में, यह अभ्यास Cargo Workspace के अंतर्निहित समर्थन के कारण विशेष रूप से लोकप्रिय है। इस लेख में, हम व्यवहार में Rust के साथ मोनोरिपॉजिटरी को व्यवस्थित करने का तरीका समझेंगे: संरचना बनाने से लेकर निर्भरता प्रबंधन और परीक्षण तक। आप सीखेंगे कि सामान्य गलतियों से कैसे बचें और अपने कोड बेस को स्केलेबल कैसे बनाएं।
Cargo Workspace क्या है और इसकी आवश्यकता क्यों है
Cargo Workspace एक तंत्र है जो आपको एक ही प्रोजेक्ट के अंतर्गत कई क्रेट्स (लाइब्रेरी या निष्पादन योग्य फ़ाइलें) प्रबंधित करने की अनुमति देता है। प्रत्येक घटक के लिए अलग-अलग रिपॉजिटरी बनाने के बजाय, आप उन्हें एक एकीकृत संरचना में जोड़ते हैं। इसके कई लाभ हैं:
- एकीकृत बिल्ड सिस्टम — एक कमांड
cargo buildसभी क्रेट्स को बनाता है। - साझा निर्भरताएँ — डुप्लिकेट निर्भरताएँ एक बार हल की जाती हैं, जिससे अंतिम बाइनरी का आकार कम होता है।
- सरलीकृत परीक्षण — एक कमांड से सभी क्रेट्स के परीक्षण चलाए जा सकते हैं।
- संस्करण स्थिरता — सभी घटक लाइब्रेरी के समान संस्करणों का उपयोग करते हैं।
मोनोरिपॉजिटरी विशेष रूप से माइक्रोसर्विसेज, सामान्य-उद्देश्य लाइब्रेरी या स्पष्ट परत विभाजन (जैसे, कोर, API, CLI) वाली परियोजनाओं के लिए उपयोगी है।
मोनोरिपॉजिटरी संरचना बनाना
आइए एक व्यावहारिक उदाहरण से शुरू करें। मान लीजिए हम एक कार्य प्रबंधन प्रणाली विकसित कर रहे हैं। हमारे पास तीन क्रेट्स होंगे:
core— व्यावसायिक तर्क वाली लाइब्रेरी।cli— कमांड लाइन के लिए निष्पादन योग्य फ़ाइल।server— वेब सर्वर (निष्पादन योग्य फ़ाइल)।
पहले, रूट डायरेक्टरी और workspace के लिए Cargo.toml फ़ाइल बनाएँ:
mkdir task_managercd task_manager# रूट Cargo.toml बनाएँtouch Cargo.tomlरूट Cargo.toml में workspace निर्दिष्ट करें:
[workspace]members = [ "core", "cli", "server",]अब cargo new का उपयोग करके प्रत्येक क्रेट बनाएँ:
cargo new core --libcargo new clicargo new serverइसके बाद संरचना इस प्रकार दिखेगी:
task_manager/├── Cargo.toml # रूट workspace├── core/│ ├── Cargo.toml│ └── src/│ └── lib.rs├── cli/│ ├── Cargo.toml│ └── src/│ └── main.rs└── server/ ├── Cargo.toml └── src/ └── main.rsध्यान दें: रूट Cargo.toml में [package] सेक्शन नहीं है, केवल [workspace] है। सही काम करने के लिए यह महत्वपूर्ण है।
क्रेट्स के बीच निर्भरता प्रबंधन
मोनोरिपॉजिटरी में प्रमुख कार्यों में से एक क्रेट्स के बीच निर्भरताओं को सही ढंग से कॉन्फ़िगर करना है। हमारे उदाहरण में, cli और server core पर निर्भर हैं। इसे उनके Cargo.toml में निर्दिष्ट करें:
cli/Cargo.toml के लिए:
[package]name = "cli"version = "0.1.0"edition = "2021"
[dependencies]core = { path = "../core" }clap = { version = "4.0", features = ["derive"] } # CLI के लिए बाहरी निर्भरताserver/Cargo.toml के लिए:
[package]name = "server"version = "0.1.0"edition = "2021"
[dependencies]core = { path = "../core" }actix-web = "4" # वेब सर्वर के लिए बाहरी निर्भरतारूट Cargo.toml में सामान्य निर्भरताएँ भी निर्दिष्ट की जा सकती हैं, यदि वे सभी क्रेट्स के लिए आवश्यक हों, लेकिन आमतौर पर यह व्यक्तिगत रूप से किया जाता है। हालाँकि, workspace संस्करण विरोधों को हल करने की अनुमति देता है: यदि दो क्रेट एक ही लाइब्रेरी का उपयोग करते हैं, तो Cargo स्वचालित रूप से एक संस्करण लाएगा।