2012-10-02 9 views
5

मेरे पास ऐसा कार्य है जो जावा स्रोतों और इन स्रोतों से जारों का एक सेट उत्पन्न करता है (कहें, प्रोजेक्ट a)। मैं इन जारों को निर्भर परियोजनाओं में निर्यात करना चाहता हूं (कहें, प्रोजेक्ट b)।ग्रैडल - क्या मैं परियोजना निर्भरताओं में कार्य का आउटपुट शामिल कर सकता हूं

//a.gradle 

configurations{ 
    generatedJars 
} 

task generateJars(type: JavaExec) { 
    //generate jars ... 

    outputs.files += //append generated jars here 
} 

dependencies{ 
    generatedJars generateJars.outputs.files 
} 


//b.gradle 

dependencies{ 
    project(path: ':a', configuration: 'generatedJars') 
} 

यह ठीक काम करता है, कि जोड़ने generateJars.outputs.files को छोड़कर के रूप में एक निर्भरता Gradle नहीं बताता है यह generateJars कार्य चलाने के लिए है कि जब वहाँ अभी तक उत्पन्न नहीं जार कर रहे हैं: तो यहाँ है कि मैं क्या अभी मोटे तौर पर है। मैंने कार्य को स्वयं निर्भरता के रूप में जोड़ने की कोशिश की है कि यह उसी तरह काम करेगा जब आप एक आर्टिफैक्ट कॉन्फ़िगरेशन (जैसे artifacts{ myJarTask }) में जार/ज़िप कार्य जोड़ते हैं, लेकिन यह मुझे बताते हुए एक त्रुटि फेंकता है कि मैं नहीं कर सकता उस। बेशक मैं :b से पहले निर्माण प्रक्रिया में कहीं generateJars कार्य इंजेक्ट कर सकता हूं, लेकिन यह बेकार और भंगुर है, इसलिए मैं इससे बचना चाहता हूं।

मुझे लगता है कि मुझे प्रोजेक्ट के artifacts{ ... } पर जेनरेट किए गए जार जोड़ना चाहिए, लेकिन मुझे यकीन नहीं है कि उन्हें कैसे निर्भर परियोजनाओं के लिए दृश्यमान बनाना है। क्या इसे हासिल करने का एक बेहतर तरीका है?

निर्भर परियोजनाओं (परियोजना b) परियोजना a के जेनरेट किए गए जार को इंगित करने के लिए इंटेलिजे आईडीईए मॉड्यूल क्लासपाथ स्थापित करने की आवश्यकता होगी। बल्कि इस (छद्म कोड) की तरह कुछ:

//b.gradle 

idea{ 
    module{ 
    scopes.COMPILE.plus += project(path: ':a', configuration: 'generatedJars').files 
    } 
} 

अब तक मैं बस पर :a के :b में generatedJars एक परियोजना निर्भरता को जोड़ने की कोशिश की है, लेकिन आइडिया प्लगइन बस एक मॉड्यूल-निर्भरता के रूप में मॉड्यूल :a कहते हैं और कहा कि मान लिया गया है यह अपने जेनरेट किए गए जार (जो शायद एक सही धारणा है) निर्यात करता है, इसलिए जेनरेट किए गए जार :b के क्लासपाथ में नहीं जोड़ते हैं।

किसी भी मदद की सराहना की जाएगी!

उत्तर

2

सबसे पहले, क्या आपको एक अलग कॉन्फ़िगरेशन की आवश्यकता है? यही है, क्या आपके पास a के ग्राहक हैं जो जेनरेट किए गए जार देखें? यदि नहीं, तो आप जेनरेट किए गए जार को archives कॉन्फ़िगरेशन में जोड़ सकते हैं, जो चीजों को सरल बना देगा।

दूसरा, विन्यास करने के लिए उत्पन्न जार जोड़ने के लिए सही तरीका (dependencies ब्लॉक के बजाय):

artifacts { 
    generatedJars generateJars 
} 

यह सुनिश्चित करें कि generateJars कार्य स्वचालित रूप से जब जरूरत को चलाने के हो जाता है बनाना चाहिए।

तीसरा, outputs.files के बाद मैं += को छोड़ दूंगा, हालांकि इससे कोई फर्क नहीं पड़ता है। आपको आवश्यक इनपुट भी जोड़ना चाहिए।

चौथा, आपको जार उत्पन्न करने के लिए JavaExec कार्य की आवश्यकता क्यों है? क्या आप इसके बजाय जेनरेट किए गए स्रोतों को कुछ स्रोत सेट में जोड़ सकते हैं और ग्रैडल को उन्हें बनाने दें?

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

+0

धन्यवाद। कार्य को 'कलाकृतियों' में जोड़ना मॉड्यूल के भीतर अच्छी तरह से woks, लेकिन मैं नहीं देखता कि मैं उन जारों को परियोजना 'बी' (उन्हें प्रकाशित किए बिना) से कैसे संदर्भित कर सकता हूं। हां, केवल स्रोत उत्पन्न करना और उन्हें मॉड्यूल स्रोत के रूप में निर्यात करना संभव है। यह काम करना चाहिए, लेकिन यह आईडीईए के लिए अतिरिक्त काम करता है, इसलिए मुझे आशा थी कि इसे किसी भी तरह से बाधित किया जा सके। हुकिंग 'विचार मॉड्यूल -> जेनरजर्स के काम को अच्छी तरह से बनाने के लिए, मुझे' बी: विचार मॉड्यूल -> ए: विचार मॉड्यूल 'जोड़ने की भी आवश्यकता है, और मेरे पास लगभग 3 मॉड्यूल हैं जिन्हें सभी को करने की आवश्यकता है। मैं उम्मीद कर रहा था कि मैं इसे किसी भी तरह से स्वचालित संकल्प के लिए सेट कर सकता हूं। – rodion

+0

विज्ञापन 1. 'प्रोजेक्ट (पथ: 'ए', कॉन्फ़िगरेशन: 'जेनरेट जार')' –

+0

विज्ञापन 2. क्या "अतिरिक्त काम" मामला है? (आप गैर-जेनरेट कोड के लिए एक ही तर्क का उपयोग कर सकते हैं।) किसी भी मामले में, आपको शायद JavaExec कार्य के बजाय फ़ाइलों को ग्रैडल से संकलित करना चाहिए। –

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