स्रोत नियंत्रण में तृतीय-पक्ष लाइब्रेरी संग्रहीत करना


83

क्या पुस्तकालयों को आवेदन पर निर्भर होना चाहिए कि स्रोत नियंत्रण में संग्रहीत किया जाए? मेरा एक हिस्सा कहता है कि यह होना चाहिए और दूसरा हिस्सा कहता है कि नहीं। एक 20mb लाइब्रेरी को जोड़ना गलत लगता है जो पूरे ऐप को सिर्फ इसलिए बौना कर देता है क्योंकि आप इसमें से कुछ कार्यों पर भरोसा करते हैं (यद्यपि भारी रूप से)। क्या आपको सिर्फ जार / डीएल स्टोर करना चाहिए या शायद परियोजना के वितरित ज़िप / टार भी?

दूसरे लोग क्या करते हैं?

जवाबों:


28

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

यदि आपको पता है कि यह आपके तीसरे पक्ष के कोड को संशोधित करने से पहले नरक में एक ठंडा दिन होगा, तो (जैसा @Matt शेपर्ड ने कहा) एक बाहरी समझ में आता है और आपको अतिरिक्त लाभ देता है कि इसे स्विच करना बहुत आसान हो जाता है पुस्तकालय के नवीनतम संस्करण में सुरक्षा अद्यतन होना चाहिए या नई सुविधा होना चाहिए जो वांछनीय हो।

इसके अलावा, जब आप अपनी जरूरत के हिसाब से लंबी धीमी लोड प्रक्रिया पर अपने कोड आधार बचत को अपडेट करते हैं, तो आप बाहरी चीजों को छोड़ सकते हैं।

@Stu थॉम्पसन ने स्रोत नियंत्रण में प्रलेखन आदि का उल्लेख किया। बड़ी परियोजनाओं में मैंने अपने संपूर्ण "क्लाइंट" फ़ोल्डर को इनवॉइस / बिल / मीटिंग मिनट / तकनीकी विनिर्देश आदि सहित स्रोत नियंत्रण में संग्रहीत किया है। हालाँकि, अहम, इन्हें एक से रिपॉजिटरी में स्टोर करना याद रखें, जिसे आप उपलब्ध करा रहे हैं: अन्य डेवलपर्स; ग्राहक; आपका "ब्राउज़र स्रोत दृश्य" ... खांसी ... :)


3
जब इंस्टॉलर के माध्यम से प्रत्येक डेवलपर्स वर्कस्टेशन पर तीसरे पक्ष के पुस्तकालयों को लाइसेंस प्राप्त करने की आवश्यकता होती है तो क्या होगा?
जिपरसन

+1, लेकिन git या hg जैसे वितरित SC के बारे में क्या होगा? पुनश्च: सबसे अच्छा SO अवतार आइकन .... कभी
slf

@slf इस लेख में git में वेंडर ब्रांचिंग करने के दो तरीके: happygiraffe.net/blog/2008/02/07/vendor-branches-in-git
MattCan

48

अब से 10 साल बाद प्रोजेक्ट बनाने के लिए आपको सब कुछ स्टोर करना होगा। मैं किसी भी पुस्तकालय के पूरे ज़िप वितरण को स्टोर कर सकता हूं, बस

2017 के लिए संपादित करें: यह उत्तर अच्छी तरह से उम्र नहीं था :-)। यदि आप अभी भी पुराने जैसे चींटी या मेक का उपयोग कर रहे हैं, तो उपरोक्त अभी भी लागू होता है। यदि आप मावेन या ग्रेडेल (या उदाहरण के लिए नेट पर) जैसे कुछ और आधुनिक का उपयोग करते हैं, तो निर्भरता प्रबंधन के साथ, आपको अपने संस्करण नियंत्रण सर्वर के अलावा एक निर्भरता प्रबंधन सर्वर चलाना चाहिए। जब तक आपके पास दोनों का अच्छा बैकअप है, और आपका निर्भरता प्रबंधन सर्वर पुरानी निर्भरता को नहीं हटाता है, आपको ठीक होना चाहिए। एक निर्भरता प्रबंधन सर्वर के एक उदाहरण के लिए, उदाहरण के लिए देखें सोनटाइप नेक्सस या JFrog Artifcatory , कई अन्य लोगों के बीच।


18
तो क्या इसमें ग्रहण या विजुअल स्टूडियो शामिल हैं?
जिपरसन

2
नहीं। बनाम के बारे में पता नहीं है, लेकिन मुझे परियोजनाओं के निर्माण के लिए ग्रहण की आवश्यकता नहीं है, बस सही JDK। हाल ही में हडसन / जेनकिंस या अन्य CI समाधान के साथ इसे लागू करना बहुत आसान हो गया है। हर प्रोजेक्ट महीने में एक बार अपने आप
बनता है

1
तो सवाल यह है कि क्या आप स्रोत नियंत्रण भंडार में भी JDK स्टोर करते हैं? आपने पंक्ति को कहां खींचा था?
जिपरसन

5
@ जेपरसन, करते थे। स्वचालित आवधिक निर्माण के साथ, जब तक यह वर्तमान JDK पर परीक्षण बनाता / पास करता है, मुझे मूल JDK की आवश्यकता नहीं है। मैं 'हर महीने इस परियोजना का निर्माण अभी भी कर सकता हूं' की लाइन तैयार करता हूं
टोनी बेनब्राहिम

20

पुस्तकालयों को संग्रहीत न करें; वे आपकी परियोजना का कड़ाई से हिस्सा नहीं बोल रहे हैं और आपके नियंत्रण प्रणाली में बेकार हो गए हैं। हालाँकि, आपके प्रोजेक्ट का उपयोग करने वाले बाहरी पुस्तकालयों के संस्करणों पर नज़र रखने के लिए मावेन (या एंट बिल्ड के लिए आइवी ) का उपयोग करें। आपको यह सुनिश्चित करने के लिए कि आपके नियंत्रण में हमेशा निर्भरता है, आपको अपने संगठन के भीतर रेपो का दर्पण चलाना चाहिए (जिसका बैकअप लिया गया है)। यह आपको दोनों दुनिया का सबसे अच्छा देना चाहिए; आपकी परियोजना के बाहर बाहरी जार, लेकिन फिर भी मज़बूती से उपलब्ध और केंद्रीय रूप से सुलभ हैं।


कुछ दुर्लभ उपयोग के मामलों के लिए, जहां आपको इंटरनेट कनेक्शन के बिना कहीं पर SW का निर्माण करना है, इसे संग्रहीत करना (यानी स्थानीय रूप से उपलब्ध होने के बाद जैसे "git क्लोन") एक आवश्यक बुराई है। आप एक ग्राहक को यह बताना नहीं चाहते हैं कि एक दिन खो गया है क्योंकि आप SW को "फ़ील्ड में" नहीं बना सकते हैं।
मूलांक

18

हम पुस्तकालयों को स्रोत नियंत्रण में संग्रहीत करते हैं क्योंकि हम स्रोत कोड की जांच करके और निर्माण स्क्रिप्ट चलाकर एक परियोजना का निर्माण करने में सक्षम होना चाहते हैं। यदि आप एक चरण में नवीनतम और निर्माण करने में सक्षम नहीं हैं, तो आप केवल बाद में समस्याओं में चलाने जा रहे हैं।


13

स्रोत नियंत्रण में अपने तृतीय पक्ष बायनेरिज़ को कभी संग्रहीत न करें। स्रोत नियंत्रण प्रणाली ऐसे प्लेटफ़ॉर्म हैं जो समवर्ती फ़ाइल साझाकरण, समानांतर कार्य, विलय के प्रयासों और इतिहास को बदलने का समर्थन करते हैं। स्रोत नियंत्रण बायनेरिज़ के लिए एफ़टीपी साइट नहीं है। 3 पार्टी असेंबली स्रोत कोड नहीं हैं; वे शायद SDLC प्रति दो बार बदलते हैं। अपने कार्यक्षेत्र को साफ करने में सक्षम होने की इच्छा, स्रोत नियंत्रण से सब कुछ नीचे खींचो और निर्माण का मतलब यह नहीं है कि 3 पार्टी विधानसभाओं को स्रोत नियंत्रण में फंसने की आवश्यकता है। आप वितरण स्क्रिप्ट से 3 पार्टी असेंबलियों को नियंत्रित करने के लिए बिल्ड स्क्रिप्ट का उपयोग कर सकते हैं। यदि आप यह नियंत्रित करने के बारे में चिंतित हैं कि आपके एप्लिकेशन का कौन सा शाखा / संस्करण किसी विशेष 3 पार्टी घटक का उपयोग करता है, तो आप इसे स्क्रिप्ट के माध्यम से भी नियंत्रित कर सकते हैं। लोगों ने जावा के लिए मावेन का उल्लेख किया है, और आप। नेट के लिए MSBuild के साथ भी कुछ ऐसा ही कर सकते हैं।


कभी मत कहो - ऊपर मेरी टिप्पणी देखें। हालांकि मैं किसी भी बेहतर समाधान के लिए खुश हूं।
मूलांक

ऐसे संगठन हैं जिनके पास 20-30 साल पहले लिखे गए टन हैं जो अजीब सामान का उपयोग करते हैं जो अब इंटरवेब पर उपलब्ध नहीं है। मेरा सुझाव है कि यदि आपको पुराने स्रोत कोड बनाने की आवश्यकता है तो यह सबसे अच्छा है कि कुछ भी आसानी से उपलब्ध न हो। कौन जानता है कि आपकी मावेन प्रक्रिया अब से 20 साल काम करेगी। मैं वास्तविक जीवन में उस परिदृश्य में चला आया हूं।
अमीनम

8

मैं आमतौर पर उन्हें भंडार में संग्रहीत करता हूं, लेकिन मैं आकार को नीचे रखने की आपकी इच्छा के साथ सहानुभूति रखता हूं।

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

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


अलग रिपॉजिटरी के विचार को पसंद करते हुए। उस समस्या को हल करता है जहाँ दूरस्थ उपयोगकर्ताओं के पास केवल स्रोत नियंत्रण तक पहुँच होती है (अर्थात वे aonumous FTP या जहाँ आप तृतीय पक्ष सामग्री डालते हैं, वहाँ नहीं पहुँच सकते हैं)। मैं स्वीकार करता हूं कि स्रोत नियंत्रण में विशाल अपरिवर्तित बायनेरिज़ को तोड़ने के लिए यह एक तरह से टूट गया है, लेकिन यह कम से कम उन्हें एकल रेपो में अलग करता है।
overthink

5

मेरे पास एक इंट्रानेट मावेन-जैसा भंडार है जहां सभी 3 पार्टी पुस्तकालय संग्रहीत हैं (न केवल पुस्तकालयों, बल्कि प्रलेखन, जावदोक और सब कुछ के साथ उनके संबंधित स्रोत वितरण)। कारण निम्नलिखित हैं:

  1. क्यों फ़ाइलों को संग्रहीत करना जो विशेष रूप से डिज़ाइन की गई फ़ाइलों को प्रबंधित करने के लिए डिज़ाइन किए गए सिस्टम में नहीं बदलते हैं?
  2. यह नाटकीय रूप से चेक-आउट को तेज़ करता है
  3. हर बार जब मैं स्रोत नियंत्रण के तहत संग्रहीत "something.jar" देखता हूं तो मैं पूछता हूं "और यह कौन सा संस्करण है?"

4

मैंने JDK और IDE को छोड़कर सब कुछ सोर्स कंट्रोल में डाल दिया।

टोनी का दर्शन ध्वनि है। डेटाबेस निर्माण स्क्रिप्ट और डेटा संरचना अपडेट स्क्रिप्ट को न भूलें। विकिस से बाहर आने से पहले, मैं अपने दस्तावेज़ को स्रोत नियंत्रण में संग्रहीत करता था।


4

मेरी प्राथमिकता थर्ड पार्टी लाइब्रेरियों को एक डिपेंडेंसी रिपॉजिटरी ( उदाहरण के लिए मावेन के साथ आर्टिफैक्ट्री ) में स्टोर करने की बजाय उन्हें तोड़फोड़ में रखने की है।

चूँकि थर्ड पार्टी लाइब्रेरियों को सोर्स कोड की तरह प्रबंधित या संस्करणित नहीं किया गया है, इसलिए यह उन्हें आपस में जोड़ने के लिए बहुत मायने नहीं रखता है। जब वे सार्वजनिक रिपॉजिटरी की किसी भी संख्या से अधिक आसानी से प्राप्त कर सकते हैं, तो दूरस्थ डेवलपर्स भी धीमी WPN लिंक पर बड़े पुस्तकालयों को डाउनलोड नहीं करने की सराहना करते हैं।


2

पिछले नियोक्ता में हमने स्रोत नियंत्रण में एप्लिकेशन (ओं) के निर्माण के लिए आवश्यक सभी चीजों को संग्रहीत किया था। एक नई बिल्ड मशीन को स्पिन करना स्रोत नियंत्रण के साथ सिंक्रनाइज़ करने और आवश्यक सॉफ़्टवेयर स्थापित करने का मामला था।


1
मेरे लिए "आवश्यक सॉफ़्टवेयर" और "एप्लिकेशन के निर्माण के लिए आवश्यक सब कुछ" के बीच कुछ ग्रे क्षेत्र प्रतीत होता है। क्या एप्लिकेशन के निर्माण के लिए एक कंपाइलर आवश्यक नहीं है? कई एसडीके और तीसरे पक्ष के पुस्तकालयों को डेवलपर्स वर्कस्टेशन पर स्थापना की आवश्यकता होती है। जब हम आम तौर पर जीएसी में होने की उम्मीद करते हैं, तो हम लाइन कहां खींचते हैं और स्रोत नियंत्रण में तृतीय पक्ष .NET लाइब्रेरी कैसे संग्रहीत की जाती हैं?
जिपरसन

1

तीसरे पक्ष के पुस्तकालयों को स्रोत नियंत्रण में स्टोर करें ताकि वे उपलब्ध हों यदि आप अपने कोड को एक नए विकास वातावरण में जांचते हैं। किसी भी "शामिल" या कमांड का निर्माण जो आपको स्क्रिप्ट बनाने में हो सकता है, इन "स्थानीय" प्रतियों को भी संदर्भित करना चाहिए।

यह सुनिश्चित करने के साथ ही कि आप जिस थर्ड पार्टी कोड या लाइब्रेरी पर निर्भर हैं, वह हमेशा आपके लिए उपलब्ध है, इसका मतलब यह भी होना चाहिए कि नए डेवलपर्स के टीम में शामिल होने पर कोड एक नए पीसी या उपयोगकर्ता खाते के निर्माण के लिए तैयार है।


1

पुस्तकालयों की दुकान! रिपोजिटरी को किसी भी समय किसी भी परियोजना को बनाने के लिए आवश्यक स्नैपशॉट होना चाहिए। जैसा कि परियोजना को बाहरी पुस्तकालयों के विभिन्न संस्करण की आवश्यकता होती है, आप इन पुस्तकालयों के नए संस्करणों में अपडेट / जांच करना चाहते हैं। इस तरह आप एक पुराने स्नैपशॉट के साथ जाने के लिए सभी सही संस्करण प्राप्त करने में सक्षम होंगे यदि आपको किसी पुराने रिलीज को पैच करना है आदि।


1

व्यक्तिगत रूप से मेरे पास मेरी परियोजनाओं के हिस्से के रूप में एक निर्भरता फ़ोल्डर है और वहां संदर्भित पुस्तकालयों को संग्रहीत करता है।

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

प्रत्येक परियोजना के लिए संकलन समय पर उपयोग की जाने वाली सभी निर्भरताएं होने का मतलब है कि कुछ साल लाइन में जब चीजें आगे बढ़ी हैं, तब भी मैं अन्य भागों को तोड़ने के बारे में चिंता किए बिना परियोजना के किसी भी हिस्से का निर्माण कर सकता हूं। किसी लाइब्रेरी के नए संस्करण में अपग्रेड करना केवल फ़ाइल की जगह और संबंधित घटकों के पुनर्निर्माण का मामला है, ज़रूरत पड़ने पर प्रबंधित करना भी मुश्किल नहीं है।

यह कहने के बाद, मुझे लगता है कि अधिकांश पुस्तकालयों को मैं संदर्भित करता हूं, लगभग कुछ सौ केबी में अपेक्षाकृत कम वजन होता है, शायद ही कभी बड़ा होता है, जो इसे स्रोत नियंत्रण में रखने के लिए मेरे लिए एक मुद्दे से कम कर देता है।


1

Git सबप्रोजेक्ट्स का उपयोग करें, और या तो 3rd पार्टी लाइब्रेरी के मुख्य git रिपॉजिटरी से संदर्भ, या (यदि यह एक नहीं है) प्रत्येक आवश्यक लाइब्रेरी के लिए एक नया git रिपॉजिटरी बनाएं। आपके पास सिर्फ एक गिट रिपॉजिटरी तक सीमित होने का कोई कारण नहीं है, और मैं आपको किसी और की परियोजना का उपयोग करने की सलाह नहीं देता हूं क्योंकि यह केवल एक निर्देशिका है।


0

प्रोजेक्ट बनाने के लिए आपको हर चीज को स्टोर करना होगा, ताकि आप बिना कुछ किए उसे चेक कर सकें और बिल्ड कर सकें।

(और, जैसा कि किसी ने दर्द का अनुभव किया है - कृपया नियंत्रण स्थापित करने और एक देव मंच पर काम करने के लिए आवश्यक सभी चीज़ों की एक प्रति रखें। मुझे एक बार एक परियोजना मिली थी जो निर्माण कर सकती थी - लेकिन एक स्थापना फ़ाइल और reg कुंजियों के बिना, आप कर सकते थे। 'थर्ड-पार्टी कंट्रोल लेआउट में कोई बदलाव न करें। यह एक मजेदार रीराइट था)


0

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


0

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

ध्यान दें कि वर्तमान में हम कई वाणिज्यिक तृतीय-पक्ष नियंत्रण सुइट्स या उस तरह की चीज़ का उपयोग नहीं करते हैं, इसलिए हम लाइसेंसिंग के मुद्दों में नहीं चलते हैं, जहां वास्तव में बिल्ड सर्वर पर एसडीके स्थापित करने की आवश्यकता हो सकती है, लेकिन मैं देख सकता हूं कि कहां आसानी से एक समस्या बन सकती है। दुर्भाग्य से मेरे पास इसका कोई हल नहीं है और जब मैं पहली बार इसमें भाग लूंगा तो इसे संबोधित करने की योजना बनाऊंगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.