मैं गिट उप-मॉड्यूल का बहुत बड़ा प्रशंसक हूं । मुझे इसके संस्करण के साथ एक निर्भरता को ट्रैक करने में सक्षम होना पसंद है, ताकि आप अपनी परियोजना के पिछले संस्करण में रोल-बैक कर सकें और सुरक्षित और स्वच्छ रूप से निर्माण करने के लिए निर्भरता का संगत संस्करण हो। इसके अलावा, हमारे पुस्तकालयों को मुक्त स्रोत परियोजनाओं के रूप में जारी करना आसान है क्योंकि पुस्तकालयों के लिए इतिहास उन अनुप्रयोगों से अलग है जो उन पर निर्भर करते हैं (और जो खुले स्रोत वाले नहीं हैं)।
मैं काम पर कई परियोजनाओं के लिए वर्कफ़्लो स्थापित कर रहा हूं, और मैं सोच रहा था कि अगर हम एकल अखंड परियोजना होने के बजाय इस दृष्टिकोण को थोड़ा चरम पर ले जाते तो कैसा होता। मुझे जल्दी से एहसास हुआ कि उप-मॉड्यूल का उपयोग करके वास्तव में कीड़े की एक संभावित कैन है।
अनुप्रयोगों की एक जोड़ी की आपूर्ति: studioऔर player, और निर्भर पुस्तकालयों core, graphऔर network, जहां निर्भरता इस प्रकार हैं:
coreस्टैंडअलोन हैgraphपर निर्भर करता हैcore(उप-मॉड्यूल पर./libs/core)networkपर निर्भर करता हैcore(उप-मॉड्यूल पर./libs/core)studioपर निर्भर करता हैgraphऔरnetwork(कम से उप मॉड्यूल./libs/graphऔर./libs/network)playerपर निर्भर करता हैgraphऔरnetwork(कम से उप मॉड्यूल./libs/graphऔर./libs/network)
मान लीजिए कि हम CMake का उपयोग कर रहे हैं और इन परियोजनाओं में से प्रत्येक में यूनिट परीक्षण और सभी कार्य हैं। (सहित प्रत्येक परियोजना studioऔर player) कोड मैट्रिक्स, इकाई परीक्षण, आदि प्रदर्शन करने के लिए स्टैंडअलोन संकलित किया जा करने में सक्षम होना चाहिए
बात यह है कि एक पुनरावर्ती है git submodule fetch, तो आपको निम्नलिखित निर्देशिका संरचना मिलती है:
studio/
studio/libs/ (sub-module depth: 1)
studio/libs/graph/
studio/libs/graph/libs/ (sub-module depth: 2)
studio/libs/graph/libs/core/
studio/libs/network/
studio/libs/network/libs/ (sub-module depth: 2)
studio/libs/network/libs/core/
ध्यान दें कि परियोजना coreमें दो बार क्लोन किया जाता है studio। इस व्यर्थ डिस्क स्थान के अलावा, मुझे बिल्ड सिस्टम की समस्या है क्योंकि मैं coreदो बार निर्माण कर रहा हूं और मुझे संभावित रूप से दो अलग-अलग संस्करण मिलेंगे core।
सवाल
मैं उप-मॉड्यूल को कैसे व्यवस्थित करूं ताकि मुझे सामान्य नेस्टेड उप-मॉड्यूल की कई प्रतियां प्राप्त किए बिना संस्करण निर्भरता और स्टैंडअलोन बिल्ड मिल जाए?
संभावित समाधान
यदि पुस्तकालय निर्भरता कुछ हद तक एक सुझाव है (अर्थात "संस्करण एक्स के साथ काम करने के लिए जाना जाता है" या "केवल संस्करण एक्स को आधिकारिक तौर पर" फैशन "का समर्थन किया जाता है और संभावित आश्रित अनुप्रयोग या लाइब्रेरी जो भी संस्करण पसंद करते हैं, उसके निर्माण के लिए जिम्मेदार होते हैं, फिर मैं निम्नलिखित परिदृश्य की कल्पना कर सकता हूं:
- के लिए बिल्ड सिस्टम है
graphऔरnetworkउन्हें बताएं कि कहां ढूंढना हैcore(जैसे संकलक के माध्यम से पथ शामिल है)। दो बिल्ड लक्ष्य, "स्टैंडअलोन" और "निर्भरता" को परिभाषित करें, जहां "स्टैंडअलोन" "निर्भरता" पर आधारित है और इसमें स्थानीयcoreउप-मॉड्यूल को इंगित करने के लिए शामिल पथ को जोड़ता है । - एक अतिरिक्त निर्भरता का परिचय दें:
studioपरcore। फिर,studioबनाता हैcore,coreउप-मॉड्यूल की अपनी प्रतिलिपि में शामिल पथ सेट करता है , फिर बनाता हैgraphऔरnetwork"निर्भरता" मोड में।
परिणामी फ़ोल्डर संरचना इस प्रकार है:
studio/
studio/libs/ (sub-module depth: 1)
studio/libs/core/
studio/libs/graph/
studio/libs/graph/libs/ (empty folder, sub-modules not fetched)
studio/libs/network/
studio/libs/network/libs/ (empty folder, sub-modules not fetched)
हालाँकि, इसके लिए कुछ बिल्ड सिस्टम मैजिक की आवश्यकता होती है (मुझे पूरा विश्वास है कि यह सीएमके के साथ किया जा सकता है) और संस्करण अपडेट के हिस्से पर थोड़ा सा मैनुअल काम (अपडेट graphको अपडेट करने coreऔर सभी परियोजनाओं में networkएक संगत संस्करण प्राप्त करने की भी आवश्यकता हो सकती है core) ।
इस पर कोई विचार?