परिचय: C++ में मोनोरिपॉजिटरी की आवश्यकता क्यों है?
बड़े C++ प्रोजेक्ट्स के विकास में अक्सर कोड संगठन की समस्या का सामना करना पड़ता है। टीमें मोनोरिपॉजिटरी (सभी कोड के लिए एक रिपॉजिटरी) और मल्टीरिपॉजिटरी (प्रत्येक लाइब्रेरी के लिए अलग-अलग रिपॉजिटरी) के बीच चयन करती हैं। C++ के संदर्भ में, मोनोरिपॉजिटरी कई लाभ प्रदान करता है: रीफैक्टरिंग को सरल बनाना, निर्भरताओं का एक समान संस्करण और एक केंद्रीकृत बिल्ड सिस्टम।
यह लेख आपको C++ के लिए मोनोरिपॉजिटरी के प्रमुख पहलुओं के बारे में बताएगा: फ़ोल्डर संरचना से लेकर CMake सेटअप और निर्भरता प्रबंधन तक। आप सीखेंगे कि प्रोजेक्ट को स्केलेबल और टीम के लिए सुविधाजनक कैसे बनाया जाए।
1. C++ के लिए मोनोरिपॉजिटरी संरचना
सही संरचना एक सफल मोनोरिपॉजिटरी का आधार है। लाइब्रेरी, एप्लिकेशन और बाहरी निर्भरताओं को अलग करने वाले पदानुक्रम का उपयोग करने की अनुशंसा की जाती है।
मूल संरचना का उदाहरण
my_monorepo/├── CMakeLists.txt # रूट CMake फ़ाइल├── cmake/ # सहायक CMake मॉड्यूल├── libs/ # प्रोजेक्ट की लाइब्रेरी│ ├── core/ # कोर (लॉजिक, उपयोगिताएँ)│ │ ├── include/│ │ │ └── core/│ │ ├── src/│ │ └── CMakeLists.txt│ ├── network/ # नेटवर्क मॉड्यूल│ │ ├── include/│ │ ├── src/│ │ └── CMakeLists.txt│ └── utils/ # सहायक उपयोगिताएँ│ ├── include/│ ├── src/│ └── CMakeLists.txt├── apps/ # निष्पादन योग्य एप्लिकेशन│ ├── server/│ │ ├── src/│ │ └── CMakeLists.txt│ └── client/│ ├── src/│ └── CMakeLists.txt├── tests/ # एकीकरण परीक्षण├── third_party/ # बाहरी निर्भरताएँ (git submodules)│ ├── fmt/│ └── spdlog/└── scripts/ # CI/CD और विकास के लिए स्क्रिप्टप्रमुख सिद्धांत
- libs/: प्रत्येक लाइब्रेरी अपने स्वयं के CMakeLists.txt के साथ एक आत्मनिर्भर मॉड्यूल है।
- apps/: एप्लिकेशन
target_link_librariesके माध्यम से लाइब्रेरी का उपयोग करते हैं। - third_party/: बाहरी निर्भरताएँ git submodules या FetchContent के माध्यम से जोड़ी जाती हैं।
- tests/: परीक्षणों के लिए एक अलग निर्देशिका जो घटकों के एकीकरण की जाँच करती है।
2. बिल्ड सिस्टम: मोनोरिपॉजिटरी के लिए CMake
CMake C++ प्रोजेक्ट्स के लिए एक मानक उपकरण है। मोनोरिपॉजिटरी में, यह लाइब्रेरी और एप्लिकेशन के बीच निर्भरता प्रबंधित करने की अनुमति देता है।
रूट CMakeLists.txt
एक रूट फ़ाइल बनाएँ जो सभी उप-प्रोजेक्ट्स को शामिल करती है:
cmake_minimum_required(VERSION 3.20)project(MyMonorepo VERSION 1.0.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)set(CMAKE_CXX_STANDARD_REQUIRED ON)
# बाहरी निर्भरताएँ शामिल करेंadd_subdirectory(third_party/fmt)add_subdirectory(third_party/spdlog)
# लाइब्रेरी शामिल करेंadd_subdirectory(libs/core)add_subdirectory(libs/network)add_subdirectory(libs/utils)
# एप्लिकेशन शामिल करेंadd_subdirectory(apps/server)add_subdirectory(apps/client)
# परीक्षण शामिल करेंenable_testing()add_subdirectory(tests)लाइब्रेरी के लिए CMakeLists.txt का उदाहरण
# libs/core/CMakeLists.txtadd_library(core src/core_module.cpp src/utilities.cpp)
target_include_directories(core PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_link_libraries(core PUBLIC fmt::fmt spdlog::spdlog)बिल्ड और परीक्षण
पूरे प्रोजेक्ट को बनाने के लिए उपयोग करें:
mkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=Releasecmake --build . --parallelctest --output-on-failure3. मोनोरिपॉजिटरी में निर्भरता प्रबंधन
मोनोरिपॉजिटरी की मुख्य समस्याओं में से एक निर्भरता संस्करण नियंत्रण है। C++ में कई