2013-03-11 17 views
17

मैं काफी अच्छा Gradle विन्यास किया था, कि सब कुछ ठीक बनाया देता है। लेकिन मेरे बहु-परियोजना निर्माण की परियोजनाओं में से एक ने उनसे बाकी हिस्सों से व्युत्पन्न किया, कि मैं खुशी से इसे किसी अन्य गिट रेपो में ले जाऊंगा और इसे संभालने के लिए सबमिड्यूल को कॉन्फ़िगर कर दूंगा।Gradle multiproject "परियोजना पर नहीं मिल सका संपत्ति 'sourceSets'" त्रुटि

सबसे पहले, मैंने परियोजना और उसके संसाधनों को सबफ़ोल्डर Libraries/MovedProject पर स्थानांतरित कर दिया। धीरे-धीरे विन्यास में कुछ लाइनों को बदलने के बाद यह ठीक काम करता है। लेकिन फिर मैंने इस परियोजना के लिए एक नया निर्माण लिखने का फैसला किया, और मुख्य कॉन्फ़िगरेशन को मुख्य से स्थानांतरित कर दिया।

और यह वह जगह है जहां सब कुछ काम करना बंद कर दिया। जब मैं किसी काम यह हमेशा समाप्त होता है Could not find property 'sourceSets' on project ':Libraries/MovedProject' साथ कॉल करने के लिए प्रयास करें। रेखा जो इसके लिए जिम्मेदार है:

dependencies { 
    ... 
    if (noEclipseTask) { 
     testCompile project(':Libraries/MovedLibrary').sourceSets.test.output 
    } 
} 

जो मैं परीक्षण जिसमें मैं अन्य परियोजनाओं से कक्षाओं का उपयोग चलाने के लिए इस्तेमाल करते हैं। यदि मैं उस रेखा को हटा देता हूं, तो बिल्ड केवल तब विफल हो जाती है जब यह प्रोजेक्ट के संकलित टेस्टजावा कार्य तक पहुंच जाती है जो MovedProject का उपयोग करती है। अगर मैं उस लाइन को हटाने और gradle :Libraries/MovedLibrary:properties फोन मैं देख सकता हूँ:

... 
sourceCompatibility: 1.7 
sourceSets: [source set main, source set test] 
standardOutputCapture: [email protected] 
... 

जबकि gradle :Libraries/MovedLibrary:build सही ढंग से बनाता है।

  1. निर्देशिका:

    • /SomeMainProject1
    • /SomeMainProject2
    • /SomeMainProject3
    • /पुस्तकालय

        सब कुछ वर्तमान में मैं मिल गया है निम्नलिखित के रूप में स्थापित

      • /MovedProject
        • build.gradle
        • dependencies.gradle
        • project.gradle
        • tasks.gradle
    • /बिल्डर
      • dependencies.gradle
      • परियोजना .gradle
      • tasks.gradle
    • build.gradle
    • settings.gradle
  2. सेटिंग्स।MovedProject के लिए Gradle

    include Libraries/MovedProject, 
         SomeMainProject1, 
         SomeMainProject2, 
         SomeMainProject3 
    
  3. sourceSets Libraries/MovedProject/project.gradle में परिभाषित कर रहे हैं:

    sourceSets { 
        main { 
         java { 
          srcDir 'src' 
          srcDir 'resources' 
         } 
         resources { srcDir 'resources' } 
        } 
        test { java { 
         srcDir 'test/unit' 
        } } 
    } 
    
  4. निर्भरता करता है कि sourceSets.test.output के उपयोग Builder/dependancies.gradle में जमा हो जाती है, और प्रत्येक परियोजना MovedProject जरूरत है चलाने के लिए सेट परीक्षण:

    project(':SomeMainProject1') { 
        dependencies { 
         ... 
    
         if (noEclipseTask) { 
          testCompile project(':Libraries/net.jsdpu').sourceSets.test.output 
         } 
        } 
    } 
    

उस त्रुटि से छुटकारा पाने के लिए सबसे आसान तरीका क्या होगा और वर्तमान निर्देशिका संरचना के साथ स्नातक निर्माण परियोजनाएं बनाना होगा? मैं समझना चाहूंगा कि धीरे-धीरे उस संपत्ति को क्यों नहीं देख सकता।

उत्तर

14

प्रश्न में लाइन समस्याग्रस्त है, क्योंकि यह धारणा है कि परियोजना :Libraries/MovedLibrary (निष्पादित नहीं) का मूल्यांकन है चालू परियोजना, जिस स्थिति नहीं हो सकता है इससे पहले कि बनाता है। और यदि ऐसा नहीं है, तो अन्य प्रोजेक्ट के स्रोत सेट अभी तक कॉन्फ़िगर नहीं किए गए होंगे। (sourceSets संपत्ति भी नहीं होगी क्योंकि java-base प्लगइन अभी तक लागू नहीं किया गया है।)

सामान्यतः, अन्य परियोजनाओं के प्रोजेक्ट मॉडल में पहुंचने के लिए सबसे अच्छा नहीं है, खासकर यदि वे बच्चे नहीं हैं वर्तमान परियोजना। प्रोजेक्ट बी के प्रोजेक्ट बी के टेस्ट कोड का उपयोग करते हुए, अनुशंसित समाधान यह है कि प्रोजेक्ट बी ने एक परीक्षण जार (artifacts {} ब्लॉक के माध्यम से) का पर्दाफाश किया है जिसे तब प्रोजेक्ट ए

द्वारा उपभोग किया जाता है यदि आप चीजों को रखना चाहते हैं हैं, आप gradle.projectsEvaluated {} या project.evaluationDependsOn() का उपयोग करके समस्या के आसपास काम करने में सक्षम हो सकते हैं। अधिक जानकारी के लिए Gradle Build Language Reference देखें।

+0

ग्रेट धन्यवाद! अब सब कुछ बनाता है। प्रयुक्त 'project.evaluationDependsOn()' संपत्ति। मुझे लगता है कि समाधान गंदा है, लेकिन मुझे थोड़ी देर के लिए इसके साथ रहना होगा। –

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