2016-09-09 3 views
15

मुझे एक प्रोजेक्ट मिला है जहां मैं जावा स्रोत फ़ाइलों के पेड़ से एक लाइब्रेरी प्रोजेक्ट में एक फ़ाइल शामिल करने का प्रयास कर रहा हूं। जो भी मैं करता हूं मैं केवल उस फ़ाइल को शामिल करने में सक्षम नहीं हूं। मुझे एक और परियोजना में सफलता मिली है, जिसमें सभी को छोड़कर सभी फाइलें शामिल हैं, लेकिन केवल लाइब्रेरी प्रोजेक्ट से ही धीरे-धीरे चलने पर ही काम किया जाता है। जब यह एप्लिकेशन निर्देशिका से चलाया गया था, तो सभी फाइलें शामिल थीं। एक साधारण परियोजना बनाने की कोशिश करते हुए, जो इस मुद्दे को पुन: उत्पन्न करता है, वही बहिष्कृत करता है जो सभी काम नहीं करता है।Gradle स्रोत से फ़ाइल को बाहर निकालेंसेट नहीं कर रहा है

नमूना फ़ाइल पेड़ सरल है:

application - android app that includes the two libraries 
library1/ 
    build.gradle 
    src/main/AndroidManifest.xml 
library2/ 
    build.gradle 
    src/main/AndroidManifest.xml 
java/src/com/company/product/ 
    /pkg1 
    Source1.java, Source2.java, Source3.java 
    libraryoneonly/Library1Source.java 
    /pkg2 
    Source1.java, Source2.java, Source3.java 

library1 build.gradle इस तरह दिखता है। इनमें से कोई भी नीचे काम शामिल या शामिल नहीं करता है।

library1/build.gradle

apply plugin: 'com.android.library' 
android { 
    sourceSets { 
     main.jni.srcDirs = [] 
     main.jniLibs.srcDir 'src/main/libs' 
     main.java { 
      srcDir "../../java/src" 
      exclude { FileTreeElement elem -> 
       println "Searching for files, found: " + elem.relativePath 
       !(elem.isDirectory() || elem.name.equals('Library1Source.java')) 
      } 
      //include ("**/libraryoneonly/**") 
      //include ('com/company/product/pkg1/libraryoneonly/Library1Source.java') 
     } 
    } 
dependencies { 
    compile project(':library2') 
} 

और library2 build.gradle। हैरानी की बात है कि नीचे उल्लिखित अनदेखा काम करता है।

library2/build.gradle

apply plugin: 'com.android.library' 

android { 
     sourceSets { 
      main.jni.srcDirs = [] 
      main.jniLibs.srcDir 'src/main/libs' 
      main.java { 
       srcDir "../../java/src" 
       //exclude { FileTreeElement elem -> ((elem.path.contains('/libraryoneonly/'))) } 
       exclude ('com/company/product/pkg1/libraryoneonly/Library1Source.java') 
      } 
     } 

बस नोट करने के लिए, मैं देख रहा हूँ कभी नहीं "फ़ाइलों के लिए खोज में पाया गया" पाठ library1 बनाने जा रहा है। मुझे यकीन नहीं है क्यों। मैं इसे बड़े प्रोजेक्ट में देखता हूं, इस परीक्षण का मॉडल कहां से चलाया गया था, इस पर निर्भर करता है कि निर्माण कहां से चलाया गया था।

आप नमूना परियोजना खींच और इसे आज़माने के लिए चाहते हैं, तो यहाँ एक कड़ी है: https://github.com/gbak/gradleTest

उत्तर

6

मैं अंत में जिस तरह से एक एकल फाइल शामिल करने के लिए पता लगा, संशोधित किए बिना चाहते हैं उपयोग करने के लिए है srcDir पथ:

main.java { 
    srcDir "../../java/src" 
    setIncludes(new HashSet(['com/company/product/pkg1/libraryoneonly/*.java'])) 
} 

पथ '**/*.java' स्वचालित रूप से एक के रूप में शामिल किया गया है शामिल हैं, किसी भी और अधिक जोड़ने भी शामिल है, के बाद से यह पहले से ही पथ एक शामिल है एक सीधा तरह स्रोत फ़ाइल के लिए शामिल हैं, कुछ नहीं करता है yway।

setIncludes() कॉल '**/*.java' सहित किसी भी मौजूदा शामिल को प्रतिस्थापित करता है और प्रदान किए गए पथ को केवल पथ के रूप में सेट करता है।

दस्तावेज़ों पर पढ़ना और मुख्य.जावा के बाद सुझाए गए प्रिंटफ स्टेटमेंट को जोड़ने में मदद मिली।

main.java.getIncludes().each { println "Added include: $it" } 
main.java.sourceFiles.each { println "File in source set: " + it } 

उन सभी के लिए धन्यवाद जिन्होंने मदद की है।

3

आपका कोड मेरे लिए सही हो रहा है यह है कि अभी FileCollectionssourceFiles तरह lazily मूल्यांकन किया जाता है, यानी आपके println कथन तब तक निष्पादित नहीं किया जाता है जब तक स्रोत सेट की सामग्री का अनुरोध नहीं किया जाता है।

तरह

main.java.sourceFiles.each { println "File in source set: " + it } 

जोड़ा जा रहा है कुछ main.java {...} बंद होने के बाद वास्तव में println काम करना चाहिए।

6

Gradle'e SourceDirectorySet में अनुपलब्ध विशेषताएं प्रतीत होती हैं। docs एक बहुत ही कह नोट हैं: - कॉन्फ़िगर शामिल/अलग-अलग स्रोत dirs के लिए शामिल नहीं है, और CopySpec TODO के साथ सामंजस्य -

TODO FileTree

जोड़ने की अनुमति CopySpec के समान सुविधाओं की कमी का मतलब है जो भी आप पूछ रहे हैं उसे करने का एक तार्किक तरीका नहीं है। include पैटर्न पहले स्रोतसेट में फ़ाइलों की एक सूची जोड़ता है और फिर आप उस सेट से कुछ फ़ाइलों को exclude कर सकते हैं। को छोड़कर,

  1. main.java sourceset परोक्ष कहते हैं **\*.java
  2. कोई सब कुछ है कि नहीं

है मतलब है कि आप एसओएल बहिष्कृत नहीं है।

आप एक अलग main.somethingElse स्रोत सेट घोषित कर सकते हैं और उपयोग में केवल एक फ़ाइल शामिल है, लेकिन मैं यह समझने में सक्षम नहीं था कि संकलन पथ में नया स्रोत कैसे जोड़ना है। हैक ने here का सुझाव दिया, कंपाइलर तर्क का उपयोग अब और काम नहीं करता है, जावा अवैध ध्वज के बारे में शिकायत करता है।

केवल वैकल्पिक हल मैं के बारे में सोच सकते हैं एक रास्ता शामिल नहीं है कि फ़ाइलें आप नहीं main.java.srcDir में library1 के लिए

main.java { 
     srcDir '../../java/src/com/company/product/pkg1/libraryoneonly' 
    } 
+0

आपकी प्रतिक्रिया के लिए धन्यवाद, मैंने थोड़ी देर पहले srcDir दृष्टिकोण की कोशिश की है और मुझे याद है कि कुछ दोष था, मुझे इसका उपयोग करने की इजाजत नहीं थी। मुझे यह याद करने के लिए स्रोतों को अलग-अलग पैकेजों में विभाजित करना भी याद है। मुझे अपनी याददाश्त को रीफ्रेश करने के लिए इसे फिर से प्रयास करना होगा। बाहर निकलें सबकुछ किसी अन्य प्रोजेक्ट में काम करता है। –

+0

क्या आपके पास srcDir दृष्टिकोण पुनः प्रयास करने का मौका था? – RaGe

+1

कृपया ध्यान दें कि एंड्रॉइड ग्रैडल प्लगइन * ग्रैडल का डिफ़ॉल्ट स्रोत (डायरेक्टरी) सेट का उपयोग नहीं करता है, लेकिन इसका अपना [एंड्रॉइडसोर्स (डायरेक्टरी) सेट] (https://google.github.io/android-gradle-dsl/current/ com.android.build.gradle.api.AndroidSourceSet.html) कार्यान्वयन। तो ग्रैडल स्रोत कोड को उद्धृत करना यहां मान्य नहीं हो सकता है। – sschuberth

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