ग्रैडल रैपर वीसीएस के लिए क्यों प्रतिबद्ध होना चाहिए?


148

स्नातक के दस्तावेज से: https://docs.gradle.org/current/dsl/org.gradle.api.tasks.wrapper.Wrapper.html

इस कार्य से उत्पन्न स्क्रिप्ट का उद्देश्य आपके संस्करण नियंत्रण प्रणाली के लिए प्रतिबद्ध होना है। यह कार्य एक छोटा ग्रेडल-रैपर.जर बूटस्ट्रैप JAR फ़ाइल और गुण फ़ाइल भी उत्पन्न करता है, जो आपके VCS के लिए भी प्रतिबद्ध होनी चाहिए। स्क्रिप्ट इस JAR को दर्शाती है।

से: स्रोत नियंत्रण में क्या नहीं होना चाहिए?

मुझे लगता Generated filesहै कि वीसीएस में नहीं होना चाहिए।

कब gradlewऔर क्या gradle/gradle-wrapper.jarआवश्यक हैं?

फाइल gradle versionमें स्टोर क्यों नहीं build.gradle?


1
नीचे दिए गए जवाबों को देखते हुए एक दिलचस्प पक्ष चर्चा क्या हो सकती है, यदि आप निरंतर एकीकरण उपकरण के कुछ रूप का उपयोग कर रहे हैं, तो इन फ़ाइलों की उपयोगिता है। ग्रेड-रैपर के लिए कौन सी जाँच करेगा और अगर वहाँ है तो इसका इस्तेमाल करेगा?
lilbyrdie

जवाबों:


124

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

यदि आप सभी एक build.gradle फ़ाइल में एक ढाल संस्करण संख्या थी, तो आपको एक README की आवश्यकता होगी जो सभी को समझाए कि gradle संस्करण X को URL Y से डाउनलोड किया जाना चाहिए और इंस्टॉल किया जाना चाहिए, और आपको हर बार संस्करण के बढ़ने पर यह करना होगा।


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

26
बिंदु पहले से स्थापित किए बिना ग्रेडेल को डाउनलोड करने में सक्षम होने के लिए है । VCS में 50KB-बड़ी फ़ाइल होने में क्या समस्या है?
जेबी निज़ेट

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

26
समस्या यह भी है कि आप याद नहीं कर सकते, इसे जारी होने के 2 साल बाद, ग्रेड के किस संस्करण का उपयोग आपके सॉफ़्टवेयर के v1.0 संस्करण को बनाने के लिए किया गया था, कि आपको उस ग्राहक के लिए हॉटफ़िक्स करना होगा जो अभी भी इस 1.0 का उपयोग कर रहा है संस्करण और उन्नयन नहीं कर सकता। ग्रेडियर रैपर हल करता है: आप VCS से 1.0 टैग को क्लोन करते हैं, इसे gradlew का उपयोग करके बनाते हैं, और यह 1.0 संस्करण बनाने के लिए 2 साल पहले उपयोग किए गए gradle संस्करण का उपयोग करता है।
जेबी निज़ेट

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

80

क्योंकि ग्रेडल रैपर का पूरा बिंदु कभी भी स्थापित किए बिना, सक्षम होने के लिए है

वही तर्क JDK के लिए जाता है, क्या आप भी ऐसा करना चाहते हैं? क्या आप अपने सभी आश्रित पुस्तकालयों का भी संचालन करते हैं?

नए संस्करण जारी होने पर निर्भरता को लगातार उन्नत किया जाना चाहिए। सुरक्षा और अन्य बग ठीक करने के लिए। और क्योंकि अगर आप बहुत पीछे हो जाते हैं तो फिर से उठने में बहुत समय लगने वाला काम हो सकता है।

यदि हर नए रिलीज के लिए ग्रेडल रैपर को बढ़ाया जाता है, और यह प्रतिबद्ध है, तो रेपो बहुत बड़ा हो जाएगा। वितरित VCS के साथ काम करते समय समस्या स्पष्ट है जहां एक क्लोन सब कुछ के सभी संस्करणों को डाउनलोड करेगा।

, और बिना यह जाने कि यह कैसे काम करता है

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

, कहाँ से डाउनलोड करने के लिए, जो संस्करण

task wrapper(type: Wrapper) {
 gradleVersion = 'X.X' 
}

और तब

gradle wrapper

सही संस्करण डाउनलोड करने के लिए।

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

ऊपर दिए गए चरणों द्वारा हल किया गया। ग्रेडल रैपर को डाउनलोड करना किसी भी अन्य निर्भरता को डाउनलोड करने से अलग नहीं है। स्क्रिप्ट किसी भी मौजूदा ग्रेडर रैपर की जांच करने के लिए होशियार हो सकती है और नया संस्करण होने पर ही इसे डाउनलोड कर सकती है।

अगर डेवलपर ने ग्रैडल को पहले कभी इस्तेमाल नहीं किया है और शायद यह नहीं जानते कि प्रोजेक्ट ग्रैडल के साथ बना है। फिर "gradlew build" चलाने की तुलना में "build.sh" चलाने के लिए यह अधिक स्पष्ट है।

यदि आपके पास build.gradle फ़ाइल में एक gradle संस्करण संख्या थी, तो आपको एक README की आवश्यकता होगी जो सभी को समझाए कि gradle संस्करण X को URL Y से स्थापित होना चाहिए।

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

और आपको हर बार संस्करण बढ़ाना होगा।

यदि डेवलपर्स सहमत हैं कि सही प्रक्रिया निम्नलिखित है:

  1. क्लोन रेपो
  2. रन स्क्रिप्ट बनाएँ

फिर नवीनतम ग्रेडल रैपर में अपग्रेड करना कोई समस्या नहीं है। यदि पिछले रन के बाद से संस्करण बढ़ा हुआ है, तो स्क्रिप्ट नया संस्करण डाउनलोड कर सकती है।


2
"निर्भरता लगातार उन्नत होनी चाहिए।" हां, आगे की दिशा में। नहीं, पिछड़े दिखने की दिशा में। एक पुराने बिल्ड को पुन: पेश करने के लिए, आपको निर्भरता के विशिष्ट संस्करणों की आवश्यकता है। ग्रैडल कुछ प्रकार के प्रोजेक्ट बनाता है जिससे निपटने में तेजी और आसानी होती है। यह एक ऐसे संगठन में गड़बड़ी होगी जिसे प्रजनन और ऑडिटिंग की आवश्यकता थी।
lilbyrdie

3
वास्तव में निश्चित नहीं कि आपका क्या मतलब है। लेकिन अगर आपके पास build.gradleसंस्करण नियंत्रण में है और इसमें आपके पास है: task wrapper(type: Wrapper) { gradleVersion = 'X.X' } तो gradle wrapperउस आवरण को डाउनलोड करेगा जिसका उपयोग किया गया था, और आप पुराने बिल्ड को पुन: उत्पन्न कर सकते हैं।
टॉमस बेज़रे

1
निर्भरता के बारे में अपनी लाइन का जिक्र कर रहा था, न कि ग्रेडेल संस्करण का। निश्चित रूप से, आप चाहते हैं कि आपके पुस्तकालयों में सभी नवीनतम सुरक्षा और बग फिक्स हों, लेकिन तब नहीं जब आप एक पुराने बिल्ड को पुन: पेश करने की कोशिश कर रहे हों, शायद ऑडिटिंग या कानूनी उद्देश्यों के लिए। आप चाहते हैं कि आपकी लाइब्रेरी और निर्माण प्रक्रिया बाइनरी समरूप आउटपुट का उत्पादन करने में सक्षम हो, यदि संभव हो तो। एक पुस्तकालय निर्भरता के साथ, इस बात की कोई गारंटी नहीं है कि भवन के समय एक विशिष्ट संस्करण उपलब्ध होगा ... अब से 2 सप्ताह या अब से 2 दशक पहले का होना चाहिए। तो हाँ, यह कुछ परियोजनाओं के लिए पुस्तकालयों और एसडीके के समान है।
लिलबर्डी

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

1
क्या आप gradle wrapperप्रत्येक बिल्ड पर क्लोन के बाद निष्पादित करने का सुझाव दे रहे हैं ? यह मूल रूप से आवरण को बेकार बना देता है, क्योंकि इसकी पूरी बात यह है कि परियोजना बनाने के लिए आपको ग्रैडल को स्थानीय रूप से स्थापित करने की आवश्यकता नहीं है !
ज़ेरुस

41

मैं एक सरल दृष्टिकोण की सिफारिश करना चाहूंगा।

आपके प्रोजेक्ट के README में, एक इंस्टालेशन स्टेप आवश्यक है, अर्थात्:

gradle wrapper --gradle-version 3.3

यह ग्रैडल 2.4 या उच्चतर के साथ काम करता है। यह "build.gradle" में जोड़ने के लिए एक समर्पित कार्य की आवश्यकता के बिना एक आवरण बनाता है।

इस विकल्प के साथ, संस्करण नियंत्रण के लिए इन फ़ाइलों / फ़ोल्डरों को अनदेखा करें (चेक न करें):

  • ./gradle
  • gradlew
  • gradlew.bat

मुख्य लाभ यह है कि आपको स्रोत नियंत्रण के लिए डाउनलोड की गई फ़ाइल में चेक-इन नहीं करना है। यह स्थापना पर एक अतिरिक्त कदम की लागत। मुझे लगता है कि यह इसके लायक है।


15
फिर आपको रैपर की आवश्यकता क्यों होगी? रैपर का पूरा विचार यह है कि आप अपने सिस्टम पर वर्गीकृत किए बिना प्रोजेक्ट बना सकते हैं।
edio

4
अच्छा समाधान। गिट में कोई बायनेरी और अभी भी उपयोग करने की क्षमता gradlew। @edio आपको एक विशेष संस्करण के ग्रेडेल को डाउनलोड करने और उपयोग करने के लिए इसकी आवश्यकता होगी ।
किरिल

3

"प्रोजेक्ट" क्या है?

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

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

यह बहुत ही सैद्धांतिक है और शायद हमारे विकास कार्यों के मामले में व्यावहारिक नहीं है। इसलिए हम इसे " आपकी परियोजना हर फ़ाइल (या फ़ोल्डर) है जिसे आपको उन्हें सीधे संपादित करने की आवश्यकता है " को बदलते हैं ।

"सीधे" का अर्थ है "अप्रत्यक्ष रूप से नहीं" और "अप्रत्यक्ष रूप से" का अर्थ है किसी अन्य फ़ाइल को संपादित करके और फिर एक प्रभाव इस फ़ाइल में परिलक्षित होगा

तो हम उसी तक पहुँचते हैं जो ओपी ने कहा था (और यहाँ कहा गया है ):

मुझे लगता है कि जनरेट की गई फाइलें VCS में नहीं होनी चाहिए।

हाँ। क्योंकि आपने उन्हें नहीं बनाया है। इसलिए वे दूसरी परिभाषा के अनुसार "आपकी परियोजना" का हिस्सा नहीं हैं।


इन फ़ाइलों के बारे में क्या परिणाम है:

  • build.gradle : हाँ। हमें इसे संपादित करने की आवश्यकता है। हमारे कार्यों का संस्करण होना चाहिए।

    नोट: जहाँ आप इसे संपादित करते हैं, वहाँ कोई अंतर नहीं है। चाहे आपके पाठ संपादक परिवेश में या प्रोजेक्ट संरचना GUI परिवेश में हो। वैसे भी आप इसे सीधे कर रहे हैं !

  • gradle-wrapper.properties : हाँ। हमें इस फ़ाइल में कम से कम ग्रेडल संस्करण निर्धारित करने की आवश्यकता है।

  • gradle- wrapper.jar और gradlew [.bat] : मैंने इस समय तक अपने किसी भी विकास कार्य में इन्हें बनाया या संपादित नहीं किया है! तो उत्तर नहीं है"। यदि आपने ऐसा किया है, तो उत्तर उस काम में आपके बारे में "हां" है (और आपके द्वारा संपादित उसी फ़ाइल के बारे में)।


नवीनतम मामले के बारे में महत्वपूर्ण नोट उपयोगकर्ता के लिए जो अपने रेपो क्लोन, पर इस आदेश पर अमल करने की जरूरत है रेपो के<root-directory> लिए स्वत: जनरेट फ़ाइलों आवरण:

> gradle wrapper --gradle-version=$v --distribution-type=$distType

$vऔर gradle-wrapper.properties$distType से निर्धारित होते हैं :

distributionUrl=https\://services.gradle.org/distributions/gradle-{$v}-{$distType}.zip

अधिक जानकारी के लिए https://gradle.org/install/ देखें ।

gradleनिष्पादन योग्य bin/gradle[.bat]स्थानीय वितरण में है। यह आवश्यक नहीं है कि स्थानीय वितरण रेपो में निर्धारित समान हो। बाद आवरण फ़ाइलों तो बनाया gradlew[.bat]स्वचालित रूप से निर्धारित कर सकते हैं डाउनलोड Gradle वितरण (स्थानीय रूप से मौजूद नहीं है)। फिर वह / वह शायद gradleऊपर दिए गए निर्देशों का उपयोग करके नए निष्पादन योग्य (डाउनलोड वितरण में) का उपयोग करके रैपर फ़ाइलों को पुन: उत्पन्न करना चाहिए ।


नोट: उपरोक्त निर्देशों में, माना जाता है कि उपयोगकर्ता के पास स्थानीय रूप से कम से कम एक ग्रेडल वितरण है (जैसे ~/.gradle/wrapper/dists/gradle-4.10-bin/bg6py687nqv2mbe6e1hdtk57h/gradle-4.10)। इसमें लगभग सभी वास्तविक मामले शामिल हैं। लेकिन क्या होगा यदि उपयोगकर्ता पहले से ही कोई वितरण नहीं करता है?

वह .propertiesफ़ाइल में URL का उपयोग करके मैन्युअल रूप से इसे डाउनलोड कर सकता है । लेकिन अगर वह इसे उस रास्ते में नहीं ढूंढता है, जिस पर रैपर को उम्मीद है, तो रैपर इसे फिर से डाउनलोड करेगा! अपेक्षित पथ पूरी तरह से अनुमानित है लेकिन विषय से बाहर है ( सबसे जटिल भाग के लिए यहां देखें )।

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


1

ग्रैडल डॉक्स के अनुसार , gradle-wrapper.jarVCS में जोड़ने की उम्मीद है क्योंकि डेवलपर्स के लिए ग्रैडल रैपर उपलब्ध कराना ग्रैडल दृष्टिकोण का हिस्सा है:

अन्य डेवलपर्स और निष्पादन वातावरण में रैपर फ़ाइलों को उपलब्ध कराने के लिए आपको उन्हें संस्करण नियंत्रण में जांचना होगा। JAR फ़ाइल सहित सभी रैपर फाइलें आकार में बहुत छोटी हैं। संस्करण नियंत्रण में JAR फ़ाइल जोड़ने की उम्मीद है। कुछ संगठन प्रोजेक्ट को बाइनरी फ़ाइलों को संस्करण नियंत्रण में प्रस्तुत करने की अनुमति नहीं देते हैं। फिलहाल दृष्टिकोण के लिए कोई वैकल्पिक विकल्प नहीं हैं।


1

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

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

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