C ++ के लिए मावेन की तरह निर्भरता प्रबंधन? [बन्द है]


94

मान लें कि मेरे पास C ++ प्रोजेक्ट है जो कई सबप्रोजेक्ट में विभाजित है। सबप्रोजेक्ट सभी डीएलएल का उत्पादन करते हैं और डेवलपर्स की अलग-अलग टीमें सबप्रोजेक्ट में से प्रत्येक पर काम करती हैं। अब अगर मैं मुख्य परियोजना का निर्माण करना चाहता हूं, तो क्या अपने आप से सभी उपप्रोजेक्ट बनाने से बचने का कोई तरीका है?

संक्षेप में, मैं एक ऐसी चीज की तलाश कर रहा हूं जो निर्भरता प्रबंधन (यानी बाइनरी फाइल और हेडर के लिए) उसी तरह से करता है जैसे मावेन जावा पर करता है।

वास्तव में, मैंने इसके लिए मावेन का उपयोग करने की कोशिश की, लेकिन यह बोझिल है, क्योंकि मुझे मैन्युअल रूप से पैकेज बनाने हैं और अक्सर, मावेन सबसे हाल के बदलावों को लेने से चूक जाते हैं। इसके अलावा, संकलन चलाना थोड़ा हैक है क्योंकि मुझे मावेन के भीतर से NAnt कॉल करना है (मैं सीधे Visual Studio समाधान बनाने के लिए NAnt की सुविधा का उपयोग करता हूं)।

यह करने के लिए कोई संकेत और विचार?


मेक का उपयोग करते समय समस्या यह है कि मुझे कम से कम एक बार सब कुछ बनाना है और इसलिए निर्भरता के लिए स्रोत फ़ाइलों की भी आवश्यकता है। विशेष रूप से, जब निर्भर पुस्तकालयों का पुनर्निर्माण किया जाता है, तो यह बहुत समय लेने वाला और गंभीर रूप से उत्पादकता को प्रभावित कर सकता है। या क्या मैं कुछ न कुछ भूल रहा हूं?
Weberste

3
यह एक उपयोगी प्रश्न लगता है। हो सकता है कि इस प्रश्न को किसी अन्य साइट पर पोर्ट किया जा सकता है जो इन प्रश्नों का अधिक स्वागत करता है? मैं c ++ निर्भरता प्रबंधन के लिए सर्वोत्तम प्रथाओं की तलाश कर रहा हूं।
simgineer

यह लगभग 10 साल देर से है, इसलिए यहां 3 संभावनाएं हैं: आप दुरुपयोग कर रहे हैं maven, आप पूरे बिंदु को याद कर रहे हैं maven, या 10 साल पहले जब मैं mavenसी ++ के लिए उपयोग नहीं कर रहा था तो यह सी ++ के लिए बहुत कम उपयोगी था। मैं 2009 के लिए नहीं बोल सकता, लेकिन अनुभव से हाल के वर्षों में, mavenवास्तव में आप जिस समस्या का वर्णन कर रहे हैं , उसका आप उपयोग करेंगे। यह वही करता है जो आप चाहते हैं, और काफी कुशलता से और अच्छी तरह से, और आपके द्वारा दावा किए जाने वाले नकारात्मक चीजों को नहीं करता है। 2019 या बाद में इसे पढ़ने वाले किसी को भी mavenइस उद्देश्य के लिए दृढ़ता से विचार करना चाहिए ।
Searchengine27

जवाबों:


37

प्रारंभिक उत्तर : मैं सीएमके का उपयोग करने का सुझाव दूंगा। यह एक मल्टी-प्लेटफॉर्म मेक फाइल जनरेटर है (विजुअल स्टूडियो या एक्लिप्स सीडीटी प्रोजेक्ट्स भी उत्पन्न करता है)।

http://www.cmake.org/

मैंने इसके साथ वास्तव में अच्छा अनुभव किया। इसके बारे में मुझे जो सबसे अच्छी बात लगी वह थी जेनेरिक प्रोजेक्ट स्ट्रक्चर तैयार करने की क्षमता। इसलिए आप हर बार स्क्रिप्ट को बदले बिना यूनिट टेस्ट आदि के लिए सब-प्रोजेक्ट लुक-अप को उदारता से शामिल कर सकते हैं।

प्रोजेक्ट के लिए आवश्यक प्री-इंस्टॉल्ड बिल्ड लाइब्रेरीज़ को खोजने के तरीके के बारे में भी उनके पास बहुत सारे मॉड्यूल हैं (जैसे बूस्ट, क्यूटी आदि)


अद्यतन : इस बीच में C ++ के लिए पैकेज प्रबंधन शुरू करने का कुछ प्रयास किया गया था। कुछ परियोजनाएं देखने लायक हैं:

  • conan.io प्रमुख बिल्ड टूल्स के साथ एकीकृत होता है:
    • CMake
    • दृश्य स्टूडियो
    • makefile
    • XCode
    • ...
  • सीएमके पर आधारित cpm ( नोट सीपीएम सक्रिय रूप से बनाए नहीं रखा जा रहा है)
  • बकारू

टिप्पणी के अनुसार @RAM द्वारा इंगित cpm अब सक्रिय रूप से बनाए नहीं रखा गया है।


7
मैंने कुछ महीने पहले सीएमके का उपयोग किया था और वास्तव में, पहले से स्थापित पुस्तकालयों के लिए जाँच बहुत अच्छी तरह से काम करती थी। हालांकि, अन्य बाइनरी निर्भरताएं (यानी मेरे सबप्रोजेक्ट से आने वाले) को आसानी से प्रबंधित नहीं किया जा सकता है। क्या मैं कुछ भूल रहा हूँ?
13

3
@weberste, वास्तव में C / C ++ के लिए उपकरण जैसा कोई मावेन नहीं है। डेवलपर्स उपकरण की तरह उपयुक्त प्रबंधन के साथ निर्भरता प्रबंधन को संभालने की कोशिश करते हैं।
सनीशाह

1
cpm सक्रिय रूप से बनाए नहीं रखा गया है और जल्दी 2015 के बाद से मर चुका है।
RAM

@ राम: इस ओर इशारा करने के लिए धन्यवाद। मैंने आपके संदर्भ में पोस्ट में एक नोट जोड़ा है।
ओवेन्स

2
सीमेक एक निर्माण प्रणाली है जिसमें निर्भरता खोजने की सीमित क्षमता है। यह एनपीएम, कार्गो, आदि के अर्थ में एक निर्भरता प्रबंधक नहीं है
sdgfsdh

17

निर्भरता प्रबंधन के लिए, यह एक नई परियोजना है (यह एक स्टार्टअप कंपनी है) जो इस प्रकार के उपकरण को लागू कर रही है: https://github.com/biicode (एक C ++ निर्भरता प्रबंधक)। आप अपनी निर्भरता जोड़ सकते हैं और यह काम करना चाहिए।

वर्तमान में, परियोजना का नाम conan.io है , उन्हें JFrog द्वारा अधिग्रहित किया गया था

अद्यतन: परियोजना मर चुकी है ... दुर्भाग्य से, ऐसा लगता है कि स्टार्टअप को पर्याप्त प्रीमियम भुगतान करने वाले ग्राहक नहीं मिल सके, लेकिन ऐसा लगता है कि सर्वर ठीक काम कर रहा है ...

UPDATE2: ऐसा लगता है कि एक विकल्प परियोजना है: conan.io (धन्यवाद @mucaho)


मैं लिंक को हटा सकता हूं .. परियोजना बंद हो गई थी, अब यह कॉनन है ।io
carlos.baez

अद्यतन के लिए धन्यवाद! मैं ज्यादातर जिज्ञासा से बाहर देख रहा हूं, ऐसा लग रहा है कि यह अभी भी प्रलेखन के लिए उनके गिटब पर चारों ओर प्रहार करना संभव है ; यह शायद एक बिंदु पर वेबसाइट पर जितना अच्छा था उतना अच्छा नहीं है, लेकिन मुझे लगता है कि यह कुछ भी नहीं से बेहतर है। बस सोच रहा था, क्या conan.io सिर्फ एक रीब्रांड है या यह एक पूरी तरह से अलग उत्पाद है?
jrh

1
रीब्रांड नहीं, बल्कि सीखे गए सभी पाठों के साथ खरोंच से एक पूरी तरह से नई परियोजना: पूरी तरह से खुला स्रोत, एक सर्वर के साथ पूरी तरह से विकेंद्रीकृत, सभी बिल्ड-सिस्टम का समर्थन करता है, बायनेरिज़ का प्रबंधन करता है।
द्रोड़ी

8

मैं निम्नलिखित उच्च-स्तरीय बिल्ड सिस्टम की अनुशंसा करता हूं:


मावेन नर प्लगइन को अच्छा समर्थन मिल रहा है। मैंने इसका इस्तेमाल किया और मुझे अब तक पसंद है। हालाँकि आपको यह समझने की आवश्यकता है कि मावेन मोनो रेपो के लिए अच्छा नहीं है। अधिकांश C ++ समाधान के लिए मोनो रेपो हैंडल शेयर लाइब्रेरियों और ऐसे की जरूरत होती है।
हंस

5

यदि आप केवल निर्भरता प्रबंधन चाहते हैं , तो आइवी की कोशिश करें , यह चींटी के साथ अच्छी तरह से एकीकृत करता है (और मुझे लगता है कि NAnt इस ब्लॉग के आधार पर वही कर सकता है , जो आइवी साइट से जुड़ा हुआ है)।

मावेन का एक .Net संस्करण बायल्डन भी है । हालांकि यह आपके लिए कितना अच्छा काम करेगा, यह नहीं जानते।


3

मेक और जीसीसी वास्तव में अच्छी निर्भरता की जाँच के लिए एक बढ़िया कॉम्बो हैं।

जीसीसी स्वचालित रूप से (-MD कमांडलाइन स्विच) 'निर्भरता फ़ाइलें' उत्पन्न कर सकता है, इसलिए उदाहरण के लिए, दिए गए हेडर पर निर्भर सभी सोर्सफाइल्स को फिर से बनाने में सक्षम होने के लिए।

मेरे कुछ सरल नियम हैं, जिन्हें मैंने अपने मेकफाइल्स में काट दिया है:

# compile c files   
%.o:    %.c
    ${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@

# compile c++ files
%.opp:  %.cpp
    ${CPP} ${CPPFLAGS} -c $< -MD -MF $(<:%.cpp=%.dep) -o $@

अब यदि आपकी ऑब्जेक्ट फाइलें OBJ_C और OBJ_CPP सूची कहती हैं:

.PHONY: cleandep
cleandep:
    rm -f $(OBJ_C:%.o=%.dep) $(OBJ_CPP:%.opp=%.dep)

-include $(OBJ_C:%.o=%.dep) $(OBJ_CPP:%.opp=%.dep)

अन्य परियोजनाओं के साथ निश्चित रूप से ट्रैक निर्भरता बना सकते हैं और इस तरह, आवश्यक के रूप में एक साझा परिवाद का पुनर्निर्माण भी।

उदाहरण के लिए, यदि आपकी अन्य टीमों ने हमेशा अपने नवीनतम DLL को कुछ साझा फ़ोल्डर पर रखा है:

myapp: ${SRC_CPP} ${LIB_DIR}other_team.lib
  ...

${LIB_DIR}other_team.lib: /shared_folder/latest/other_team.lib
  cp /shared_folder/latest/other_team.lib ${LIB_DIR}other_team.lib

इस समाधान के साथ मेरी चिंताओं के बारे में प्रश्न से जुड़ी मेरी टिप्पणी देखें
Weberste

यदि कोई लक्ष्य किसी अन्य फ़ाइल पर निर्भर है, जैसे कि आपका निष्पादन योग्य एक साझा पुस्तकालय पर निर्भर है, तो आपके पास उस साझा पुस्तकालय के लिए एक नियम हो सकता है जो यह सुनिश्चित करता है कि पुस्तकालय की आपकी प्रतिलिपि स्रोत की आवश्यकता के बिना अद्यतित है, जैसे कि बस प्राप्त करके किसी विशेष स्थान से या कुछ संस्करण नियंत्रण अद्यतन या ऐसे निष्पादित करने से नवीनतम प्रति।
विल

${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@मेरे पास इन सभी मेक सिंबल को पार्स करने का एक कठिन समय था, यह कुछ इस तरह दिखता है जैसे g++ -c main.cc -MD -MF testकि आप इसे कमांड लाइन पर स्टैंडअलोन चलाना चाहते हैं, और यह परिणामों को 'परीक्षण' नामक फ़ाइल में रखता है।
jrh


2

मैं कॉनन की सलाह देता हूं, जिसका उपयोग मैं इन दिनों कर रहा था। अपनी परियोजना में सभी आश्रित पुस्तकालयों और बायनेरिज़ को बनाए रखने के लिए यह बहुत शक्तिशाली है।


1

आप उपयोग किए गए पुस्तकालयों के लिए NuGet पैकेज बना सकते हैं और निर्भरता प्रबंधन के लिए NuGet का उपयोग कर सकते हैं।

यह भी देखें, C ++ के लिए NuGet



@ पर्याप्त, यह एक स्टैंडअलोन निर्भरता प्रबंधन के रूप में भी इस्तेमाल किया जा सकता है। (4M निष्पादन योग्य फ़ाइल)
Yousha Aleayoub

0

SCons के शीर्ष पर कई टूल हैं, जो ऑटोटूल के समान उच्च-स्तरीय कार्यक्षमता प्रदान करते हैं जो डेवलपर्स के जीवन को आसान बनाने की कोशिश कर रहे हैं (जैसे WAF, SNOCS)। दुर्भाग्य से, SCons के पास बड़ी कमियां हैं - बड़ी परियोजनाओं के लिए लंबे समय तक संकलन समय।

मैं उन लोगों के लिए एसएनओसीएस (जो कि एक रिवर्स रिवर्स है) को आज़माने की सिफारिश कर सकता हूँ, जो आप एक आसान निर्भरता प्रबंधन की तलाश में हैं और एकल कमांड (संकलन, x86 / x64, डीबग / रिलीज़, स्टैटिक / शेयर्ड लाइब्रेरीज़, टेस्ट / टेस्ट) में संकलन विकल्प चुन रहे हैं। लक्ष्य स्थापित करें, आदि)।

SNOCS अलग-अलग फ़ाइलों में प्रोजेक्ट कॉन्फ़िगरेशन आउटपुट को संग्रहीत करके लंबे संकलन समय की समस्या से निपटने की कोशिश करता है, जिसके परिणामस्वरूप परिणामी कॉन्फ़िगरेशन कॉन्फ़िगरेशन चरण को पूरी तरह से छोड़ देता है और सीधे भवन चरण में जाता है (अंतिम विशेषता अभी निर्माणाधीन है)

सीएमके का विन्यास एक बड़े समाधान में थकाऊ हो जाता है, इसलिए बिल्ड सिस्टम रखरखाव डेवलपर समय का एक बड़ा हिस्सा लेता है। सौभाग्य से जैसा कि मार्टिज़न ने पहले ही उल्लेख किया है कि बायोडोड है जो "अपनी निर्भरता के साथ आपकी परियोजना को उत्पन्न करने के लिए सीएमके का उपयोग करता है"।


-1

SCons की कोशिश करो

SCON एक ओपन सोर्स सॉफ्टवेयर कंस्ट्रक्शन टूल है, जो कि अगली पीढ़ी का बिल्ड टूल है। क्लासिक के लिए एक बेहतर, क्रॉस-प्लेटफ़ॉर्म विकल्प के रूप में SCons के बारे में सोचो ऑटोकॉफ़ / ऑटोमेक और संकलक कैश जैसे ccache जैसी एकीकृत कार्यक्षमता के साथ उपयोगिता बनाएं। संक्षेप में, सॉफ्टवेयर बनाने के लिए SCons एक आसान, अधिक विश्वसनीय और तेज़ तरीका है।


3
SCons में कोई निर्भरता प्रबंधन या रिपॉजिटरी में निर्मित नहीं है जैसे कि पूछा गया।
मैक्सिम वायार्गेट्स

-3

मैं सभी निर्माण निर्भरता प्रणालियों की मां का उपयोग करने की सलाह देता हूं: बनाते हैं।


मैं इसे बड़े पैमाने पर इस्तेमाल करता हूं। GCC निर्भरता फ़ाइलें बना सकती है जो 'मेक' खा सकती हैं। एक और जवाब के लिए पर्याप्त है, शायद ...
विल

8
बनाने वास्तव में क्या हर कोई से बचने के लिए चाहता है / निर्माण-उपसंहार-प्रणालियों को देखकर बदल
chila

-6

स्कोनस की कोशिश करें, आप झुके रहेंगे। बनाना पुराना है, मुश्किल है और बनाए रखने के लिए महंगा है।


मेरे पास स्कैन पर एक नज़र थी, लेकिन बाइनरी निर्भरता को प्रबंधित करने का तरीका नहीं मिला। क्या आपके पास इसके लिए कोई उदाहरण है?
Weberste

1
चूंकि स्कैन्स अजगर है, आप अपने बाइनरी निर्भरता को काफी आसानी से प्रबंधित करना चाहते हैं। शायद आपके बाइनरी निर्भरताओं की निर्देशिका में "SConscript" होने से भी मदद मिलती है। मुझे यकीन नहीं है कि यहां आपकी आवश्यकताएं क्या हैं। पेड्रो।
प्यूट्र

16
तो आप "मुझे यकीन नहीं है कि आपको क्या चाहिए, पर आधारित एक उपकरण का सुझाव दे रहे हैं, लेकिन आप इसे पायथन में खुद से प्रोग्राम कर सकते हैं"। फिर आपको स्कैन्स की आवश्यकता क्यों है?
jalf
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.