जब एक विकल्प नहीं है तो ओपन सोर्स सॉफ्टवेयर को पैच करना?


13

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

कभी-कभी आपने उस विशेष मॉड्यूल के महंगे रिफ्लेक्टर से बचने के लिए उस बग को ठीक कर दिया, हालांकि तकनीकी और / या राजनीतिक कारणों से, आप नवीनतम रिलीज में अपग्रेड नहीं कर पाएंगे।

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

उनकी नजर में क्योंकि यह कोड परिवर्तन हमारे द्वारा केवल हमारे उपयोग के लिए किया गया था, यह हमारे कोड बेस का हिस्सा होना चाहिए, जिसका अर्थ है कि ओपन सोर्स सॉफ्टवेयर को थर्ड पार्टी डिपेंडेंसी के रूप में पेश करने के बजाय, हमें इसे एक नए प्रोजेक्ट के रूप में पेश करना चाहिए और इसमें शामिल होना चाहिए हमारी निर्माण प्रक्रिया में इसका स्वचालित निर्माण।

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

क्या इस मामले में उपरोक्त करना बुरा होगा? यदि ऐसा है, तो खुले स्रोत को बदलने के लिए आदर्श स्थिति क्या है, लेकिन केवल घर में आपके एकमात्र लाभ के लिए?


1
कृपया मुझे बताएं कि क्या आपको लगता है कि प्रश्न रचनात्मक नहीं है या इसमें सुधार किया जा सकता है।
maple_shaft

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

जवाबों:


12

यदि आप बाद के संस्करण का उपयोग नहीं कर सकते हैं, तो आपके सामने समस्या नहीं है, केवल विकल्प आपके पास हैं

  • समस्या के साथ रहते हैं और एक समाधान पाते हैं
  • लाइब्रेरी को कांटा करें और इसे अपने निजी संस्करण में ठीक करें (जो कि आप प्रभावी रूप से कर रहे हैं)
  • तौलिया में फेंक दें और अपने प्रबंधकों को बताएं कि समस्या असंवेदनशील है (जो झूठ होगा, क्योंकि आपके पास दो अन्य विकल्प खुले हैं)।


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


दिलचस्प! मैंने कभी भी डिकॉपिंग में मदद करने के लिए लाइब्रेरी को लपेटने की संभावना पर विचार नहीं किया। आपके सहयोग के लिए धन्यवाद!
maple_shaft

यदि आप उन्हें चौकोर से प्रयोग करते हैं, तो रैपर्स एक अच्छा विचार है। यदि आप पहले से ही सीधे पुस्तकालय का उपयोग कर रहे हैं, तो जेनेरिक रैपर पर स्विच करने के लिए बहुत सारे कोड की रीफैक्टरिंग और पुनः परीक्षण की आवश्यकता होगी।
Blrfl

1
@Blfl हाँ, इसीलिए इसे हल्के में लेने का कदम नहीं है। लेकिन कम से कम एक मामले में हमारे पास एक 3 पार्टी (ओएसएस) पुस्तकालय था, जो 2 छोटे रिलीज के बीच अपने सभी पैकेजों और क्लासनेम को बदल देता था, और इसे अपनाने के लिए कोई सहारा नहीं था, इसलिए रिफैक्टिंग वैसे भी किया जाना था। इस तरह, हमने भविष्य के प्रमाण को समाप्त कर दिया और साथ ही इस मुद्दे को ठीक कर दिया कि नए संस्करण का उपयोग करने की आवश्यकता के कारण।
jwenting

@ जेंटिंग: बिल्कुल सहमत हैं। मैं बूस्ट के साथ एक ही काम करता हूं क्योंकि जबकि उनके कुछ कार्यान्वयन अच्छे हैं, तो इंटरफेस को आपत्ति हो सकती है। कि, और वे अक्सर चारों ओर चीजों को बदलने के लिए करते हैं, भी।
Blrfl

2
ध्यान दें कि कुछ लिनक्स वितरण प्रभावी रूप से अपने स्वयं के ”कांटे” बनाए रखते हैं, जो पहले जारी किए गए सिक्योरिटी पैच को वापस भेजते हैं।
लियोरी

6

आप जो करने जा रहे हैं वह अधिक सामान्य मामले में एक बुरा विचार है जहां आप तृतीय-पक्ष सॉफ़्टवेयर को बंडल करते हैं और उनकी रिलीज़ को ट्रैक करने का इरादा रखते हैं । आमतौर पर लोग ऐसा इसलिए करते हैं क्योंकि वे तृतीय-पक्ष घटक में एक सुविधा चाहते हैं जो अनुरक्षक आपके लिए आवश्यक तरीके से लागू करने, या लागू करने के लिए तैयार नहीं हैं।

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


3

वास्तव में ऐसा करने में कुछ भी गलत नहीं है क्योंकि जब तक हर कोई लागत, लाभ और जोखिमों को पूरा कर सकता है।

... फिक्स काफी सरल लगता है ... कोड को खुद पैच करने के लिए

जब आपके पास करने के लिए एक नौकरी होती है, तो सही (तीसरी पार्टी की लाइब्रेरी होना जो आप चाहते हैं) ठीक-ठाक दुश्मन है (इसे खुद को थपथपाना), और कभी-कभी आपको इस तरह की चीजें करनी होती हैं। मैंने कई परियोजनाएँ की हैं जहाँ हमने वाणिज्यिक पुस्तकालयों के लिए स्रोत लाइसेंस खरीदे हैं ताकि हम विक्रेता को मिलने से पहले ही समस्याओं को ठीक कर सकें।

... detractors इस मामले में बहस करना चाहते हैं कि यह लगभग हमेशा एक बुरा विचार है कि यह जोखिम भरा है और एक परेशानी की जटिलता का परिचय दे रहा है।

यदि आपके पास किसी और के कोड को डिसाइड करने, किसी समस्या की पहचान करने और एक फिक्स लिखने के लिए चॉप नहीं है तो यह एक बुरा विचार है। यह सच है कि क्या कोड इन-हाउस या थर्ड पार्टी है; एकमात्र अंतर यह है कि क्या यह आपकी गोद में उतरने से पहले एक क्यूबिकल या इमारत की दीवार पर फेंका गया था।

यदि आपके अवरोधक केवल इस पैच को नहीं करने की लागतों को तौलने के बिना विचार को अलग कर रहे हैं, तो वे अपना होमवर्क नहीं कर रहे हैं। यदि आपके पास बहुत सारे इन-हाउस कोड हैं जो बग से प्रभावित होते हैं तो आपका पैच ठीक हो जाएगा, आपको इसके माध्यम से जाना होगा और इसे अपने चारों ओर काम करने के लिए बदलना होगा और यह सुनिश्चित करने के लिए कि यह सही ढंग से काम करता है, सब कुछ फिर से परीक्षण करें। फिर, क्या आपको कभी पैकेज को बग-फिक्स्ड संस्करण में अपग्रेड करना चाहिए, आपको अपने वर्कअराउंड को ढूंढना होगा और फिर से परीक्षण करना होगा। ऐसा करने के लिए जोखिम भी हैं, जैसे कि आपके द्वारा बदला गया मामला या अपर्याप्त परीक्षण गुम होना। निजी तौर पर, अगर मुझे इसके स्रोत पर बग को ठीक करने का अवसर मिला है, तो मैं इसे बाकी के कोड के बजाय एक फ्लाईस्वैटर के साथ पीछा करने के बजाय बहुत कुछ करूंगा और आशा करता हूं कि मुझे सब कुछ मिल जाएगा।

... कोड परिवर्तन हमारे द्वारा किया गया था ... यह हमारे कोड आधार का हिस्सा होना चाहिए ... हमें इसे एक नई परियोजना के रूप में पेश करना चाहिए और इसकी निर्माण प्रक्रिया में इसके स्वचालित निर्माण को शामिल करना चाहिए।

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

... हम उनके स्रोत नियंत्रण भंडार से उनके कोड को हमारे में खींच रहे होंगे, और हम किसी भी कोड परिवर्तन के पीछे का इतिहास खो देंगे ...

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

इसके अलावा यह सिर्फ कुछ ऐसा लगता है जो इतने छोटे कोड परिवर्तन के लिए बहुत जटिल है जिसे बनाने की आवश्यकता है।

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


2

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

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

दूसरे शब्दों में: इसे अपनी स्थिति में बाकी सभी लोगों के लिए भी पैच करें। निश्चित रूप से यह केवल तभी संभव है जब परियोजना रिलीज़ किए गए संस्करणों को अपडेट (या कम से कम अनुमति) अपडेट का समर्थन करती है। लेकिन यह निश्चित रूप से इन दिनों बहुत मानक अभ्यास है।

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