2015-06-09 11 views
6

मैं ग्रैडल सीख रहा हूं और यह समझने की कोशिश कर रहा हूं कि इनपुट और आउटपुट फाइलें कैसे निर्धारित करती हैं कि कोई कार्य अद्यतित है या नहीं।ग्रैडल इनपुट और आउटपुट

यह कार्य कभी भी अद्यतित नहीं है, भले ही बिल्ड फ़ाइल परिवर्तित न हो।

task printFoo() { 
     inputs.file(getBuildFile()) 

     doLast { 
      println 'foo' 
     } 
    } 

यह कार्य हमेशा अद्यतित रहता है, भले ही बिल्ड फ़ाइल बदलती है।

task printFoo() { 
     outputs.file(getBuildFile()) 

     doLast { 
      println 'foo' 
     } 
    } 

मैंने उम्मीद की थी कि दोनों उदाहरण केवल तभी कार्य करें जब बिल्ड फ़ाइल बदलती है, और अन्यथा अद्यतित हो। मैं क्या खो रहा हूँ?

उत्तर

5

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

पहले मामले में आपके पास कोई आउटपुट टाइमस्टैम्प नहीं है क्योंकि आपके पास कोई आउटपुट नहीं है। ग्रैडल यह निर्धारित नहीं कर सकता कि आपके आउटपुट अद्यतित हैं, क्योंकि यह उन्हें नहीं जानता है। तो यह आपके आउटपुट को हमेशा पुराना मानता है। प्रलेखन से: "किसी भी परिभाषित आउटपुट वाले कार्य को कभी भी अद्यतित नहीं माना जाएगा।" (https://docs.gradle.org/current/userguide/more_about_tasks.html#sec:up_to_date_checks)

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

+0

मैंने कई फाइलों के साथ फिर से परीक्षण किया: स्थिति हमेशा अद्यतित होती है जब केवल आउटपुट निर्दिष्ट होता है। जब इनपुट और आउटपुट दोनों निर्दिष्ट होते हैं, तो अपेक्षित स्थिति में परिवर्तन होता है (भले ही इनपुट और आउटपुट एक ही फ़ाइल हों)। मैंने इस उत्तर को कथन के आधार पर स्वीकार कर लिया है, "_Gradle को इनपुट और outputs._ के लिए टाइमस्टैम्प की आवश्यकता है।" मेरा परीक्षण दिखाता है कि दोनों आवश्यक हैं। – jaco0646

+1

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

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