2011-10-10 13 views
10

स्पष्ट रूप से मुझे समझ में नहीं आता कि यहां क्या हो रहा है।ग्रेडल परियोजना गुणों को समझने की कोशिश कर रहे हैं

मुझे लगता है कि prop2 और prop3 को एक्सेस नहीं किया जा सकता क्योंकि वे "प्रोजेक्ट गुणों" के बजाय चर हैं।

प्रश्न उठ गया क्योंकि मैं "doTheThing()" विधि के भीतर सेरिबेल प्रोप 2 और प्रोप 3 को दिखाना चाहता हूं, लेकिन मैं उन्हें पास नहीं करना चाहता हूं। मैं चाहता हूं कि चर वैश्विक रूप से पहुंच योग्य हों कार्यों, विधियों और वर्गों के लिए (लेकिन केवल निर्माण स्क्रिप्ट में ही भीतर से) - और मैं उन्हें टाइप करना चाहता हूं (यही कारण है कि प्रोप 1 का निर्धारण स्वीकार्य नहीं है)।

वास्तव में, हालांकि - मुझे लगता है कि मैं जो पूछ रहा हूं वह कुछ समझने में मदद करता है कि ग्रैडल प्रोजेक्ट प्रॉपर्टी क्या है और सिंटैक्स 'prop1 = "blah" वास्तव में क्या कर रहा है।

मैंने ग्रैडल उपयोगकर्ता मार्गदर्शिका और ग्रैडल इन एक्शन पढ़ा है - यदि वे पहले से ही इस अवधारणा को समझाते हैं तो कृपया मुझे सही सेक्शन पर इंगित करें (शायद मैं उस समय उस पर चमक कर रहा हूं जो समझ रहा था)।

prop1 = "blah" 
String prop2 = "bleah" 
def prop3 = "blargh" 

task testPropAccess << { 
    println "1: $prop1" 
    println "2: $prop2" 
    println "3: $prop3" 
    doTheThing() 
} 

private void doTheThing(){ 
    println "4: $prop1" 
    println "5: $prop2" // error: Could not find property 'prop2' on root project 'script' 
    println "6: $prop3" // error: Could not find property 'prop3' on root project 'script' 
} 
+0

यह भी मदद करनी चाहिए: http://groovy.codehaus.org/Scoping+and+the+Semantics+of+%22def%22 – rodion

+0

@ रोडियन - वह लिंक काफी उपयोगी था, धन्यवाद। मान लीजिए मुझे कुछ और ग्रोवी-उन्मुख शोध करने की ज़रूरत है। – Shorn

+0

कोई भी ऐसा करने के लिए देख रहा है, मेरे इच्छित कार्यक्षमता प्राप्त करने के लिए मेरा वर्तमान कार्यप्रणाली इस तरह की कक्षा में मेरी बिल्ड-स्क्रिप्ट विस्तृत गुणों को परिभाषित करना है: 'कक्षा स्टेटिकप्रॉप { स्थैतिक स्ट्रिंग prop4 = System.getProperty ("prop4" , "wibble") } ' और फिर उन्हें इस तरह का उपयोग करें: ' System.getProperty ("prop4", StaticProps.prop4) ' – Shorn

उत्तर

19

जब आप सबसे बाहरी स्तर पर एक चर घोषित (अपने दूसरे और तीसरे बयान में के रूप में), यह स्क्रिप्ट के run विधि की एक स्थानीय चर हो जाता है। यह वास्तव में सिर्फ ग्रोवी व्यवहार है, और कुछ भी नहीं है कि ग्रैडल आसानी से बदल सकता है।

यदि आप वैश्विक चर के बराबर चाहते हैं, तो बस एक अनबाउंड चर (जैसा कि आपके पहले कथन में) के लिए एक मान असाइन करें। यह ग्रैडल की Project ऑब्जेक्ट में एक गतिशील प्रॉपर्टी जोड़ता है, जो पूरे निर्माण स्क्रिप्ट में दिखाई देता है (जब तक कि छाया न हो)। दूसरे शब्दों में, prop1 = "blah"project.prop1 = "blah" के बराबर है।

यदि आप टाइप किए गए ग्लोबल वैरिएबल के बराबर चाहते हैं, तो आपको ग्रैडली 1.8 तक अपग्रेड करने तक प्रतीक्षा करनी होगी, जिससे @Field एनोटेशन के साथ यह संभव हो जाता है। या आप एक प्लगइन लिखते हैं जो Project ऑब्जेक्ट में एक सम्मेलन ऑब्जेक्ट को मिश्रित करता है (लेकिन यह विज्ञापन-प्रसार स्क्रिप्टिंग के लिए उपयुक्त नहीं है)।

+16

होना चाहिए जो इस पर ठोकर खाती है, अब यह अनुशंसा की जाती है कि जब पीटर आपको सुझाव देता है तो उसे 'ext.prop1 =" blah "लिखें। पुरानी तकनीक अभी भी काम करती है लेकिन इसे हटा दिया जाता है और चेतावनी उत्पन्न करता है। एक्सटी का उपयोग करना स्पष्ट रूप से यह कहने का एक अच्छा तरीका है कि आप एक नई संपत्ति बनाना चाहते हैं। यदि आपको लगता है कि आप मौजूदा संपत्ति का उपयोग कर रहे हैं और अनजाने में एक नया बना रहे हैं तो यह बहुत निराशाजनक हो सकता है, इसलिए यह शायद एक बहुत अच्छा बदलाव है। –

+0

हाय फिर पीटर। त्वरित प्रश्न, मैंने शीर्ष स्तर build.gradle फ़ाइल पर 'ext.blah =' foobar'' चर बनाया है, लेकिन यह 'buildscript' के दायरे में नहीं है, कोई विचार क्यों? – Bob

+0

यह एक अलग प्रश्न होना चाहिए (यदि यह पहले से मौजूद नहीं है)। –

संबंधित मुद्दे