C++ के साथ मोनोरिपॉजिटरी: व्यवहार में कोड का संगठन

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: C++ के लिए मोनोरिपॉजिटरी क्यों?



आधुनिक C++ विकास में, विशेष रूप से मध्यम और बड़े आकार की परियोजनाओं में, कोड का संगठन एक महत्वपूर्ण कार्य बन जाता है। मोनोरिपॉजिटरी (monorepo) एक दृष्टिकोण है जिसमें सभी घटकों, लाइब्रेरीज़ और सेवाओं का कोड एक ही रिपॉजिटरी में संग्रहीत किया जाता है। मल्टीरिपॉजिटरी के विपरीत, मोनोरिपॉजिटरी एक एकल प्रवेश बिंदु प्रदान करता है, रीफैक्टरिंग और निर्भरता प्रबंधन को सरल बनाता है। व्यवहार में, इसका मतलब है कि आप किसी लाइब्रेरी के API को बदल सकते हैं और तुरंत देख सकते हैं कि इसका सभी आश्रित मॉड्यूल पर क्या प्रभाव पड़ता है।



इस लेख में, हम मोनोरिपॉजिटरी में C++ कोड को व्यवस्थित करने के व्यावहारिक पहलुओं पर चर्चा करेंगे: फ़ोल्डर संरचना से लेकर CI/CD सेटअप तक। आप सीखेंगे कि सामान्य गलतियों से कैसे बचें और बिल्ड को तेज़ और पूर्वानुमानित कैसे बनाएं।



1. C++ के लिए मोनोरिपॉजिटरी संरचना



सही फ़ोल्डर संरचना एक सफल मोनोरिपॉजिटरी की नींव है। आइए C++ परियोजनाओं के लिए अनुशंसित पदानुक्रम देखें।



मूल निर्देशिका पदानुक्रम



my_project/├── CMakeLists.txt          # रूट बिल्ड फ़ाइल├── cmake/                  # कस्टम CMake मॉड्यूल│   └── FindMyLib.cmake├── libs/                   # आंतरिक लाइब्रेरीज़│   ├── core/│   │   ├── CMakeLists.txt│   │   ├── include/│   │   │   └── core/│   │   │       ├── utils.h│   │   │       └── types.h│   │   └── src/│   │       ├── utils.cpp│   │       └── types.cpp│   └── network/│       ├── CMakeLists.txt│       ├── include/│       │   └── network/│       │       └── http_client.h│       └── src/│           └── http_client.cpp├── apps/                   # निष्पादन योग्य एप्लिकेशन│   ├── server/│   │   ├── CMakeLists.txt│   │   └── src/│   │       └── main.cpp│   └── cli/│       ├── CMakeLists.txt│       └── src/│           └── main.cpp├── tests/                  # एकीकरण परीक्षण│   ├── CMakeLists.txt│   └── test_integration.cpp├── third_party/            # बाहरी निर्भरताएँ (vendoring)│   ├── fmt/│   └── spdlog/├── .github/                # CI/CD कॉन्फ़िगरेशन│   └── workflows/│       └── build.yml└── README.md


मुख्य सिद्धांत:

  • libs/ — सभी आंतरिक लाइब्रेरीज़। प्रत्येक लाइब्रेरी का अपना फ़ोल्डर CMakeLists.txt के साथ होता है।
  • apps/ — निष्पादन योग्य फ़ाइलें। ये libs/ से लाइब्रेरीज़ पर निर्भर करती हैं।
  • third_party/ — वेंडर निर्भरताएँ (git submodules या कॉपी किए गए स्रोत)।
  • tests/ — एकीकरण परीक्षण जो कई लाइब्रेरीज़ के बीच इंटरैक्शन की जाँच करते हैं।


लाइब्रेरी के लिए CMakeLists.txt उदाहरण



# libs/core/CMakeLists.txtadd_library(core    src/utils.cpp    src/types.cpp)

target_include_directories(core PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include>)

target_link_libraries(core PUBLIC fmt::fmt spdlog::spdlog)


महत्वपूर्ण: निर्भरताओं को सही ढंग से प्रसारित करने के लिए PUBLIC और PRIVATE का उपयोग करें। यह एक महत्वपूर्ण बिंदु है — यदि लाइब्रेरी A, लाइब्रेरी B का उपयोग केवल अपने स्रोतों में करती है, तो B को PRIVATE बनाएं।



2. मोनोरिपॉजिटरी में निर्भरता प्रबंधन



मोनोरिपॉजिटरी की मुख्य समस्याओं में से एक है "निर्भरता का नरक"। C++ में, इसे CMake target-oriented design (लक्ष्य-उन्मुख डिज़ाइन) के माध्यम से हल किया जाता है।



नियम: एक लक्ष्य — एक लाइब्रेरी



प्रत्येक लाइब्रेरी को ठीक एक CMake लक्ष्य निर्यात करना चाहिए। यह लिंकिंग को सरल बनाता है और चक्रीय निर्भरताओं को रोकता है।



# रूट CMakeLists.txtcmake_minimum_required(VERSION 3.20)project(MyProject VERSION 1.0.0 LANGUAGES CXX)

# सभी लाइब्रेरीज़ शामिल करेंadd_subdirectory(libs/core)add_subdirectory(libs/network)

ब्लॉग

पुस्तक अनुशंसाएँ