2013-09-02 10 views
5

मैं एक काम मैं Gradle के लिए एक चींटी निर्माण में है कन्वर्ट करने के लिए कोशिश कर रहा हूँ:एंड्रॉयड + Gradle: एक फ़ाइल में सूची निर्देशिका

<target name="index-assets" depends="copy-assets"> 
    <path id="assets.path"> 
     <!-- contexts (and surplus) --> 
     <dirset id="assets.dirset" dir="assets/" defaultexcludes="yes"/> 
     <!-- assets --> 
     <fileset id="assets.fileset" dir="assets/" includes="**" excludes="asset.index" defaultexcludes="yes"/> 
    </path> 

    <pathconvert pathsep="${line.separator}" property="assets" refid="assets.path" dirsep="/"> 
     <mapper> 
      <globmapper from="${basedir}/assets/*" to="*" handledirsep="yes"/> 
     </mapper> 
    </pathconvert> 

    <echo file="assets/asset.index">${assets}</echo> 

</target> 

<target name="-pre-build" depends="index-assets"/> 

मुझे लगता है कि मैं अभी भी कर रहा हूँ पूरी तरह से बुनियादी Gradle अवधारणाओं लोभी नहीं है, लेकिन यहाँ मैं क्या करने की कोशिश की है:

task indexAssets << { 

def assets = file("assets") 
def contexts = files(assets) 
inputs.file(assets) 
outputs.file("assets/assets-gradle.index") 

def tree = fileTree(dir: 'assets', include: ['**/*'], exclude: ['**/.svn/**', 'asset.index']) 

contexts.collect { relativePath(it) }.sort().each { println it } 
tree.collect { relativePath(it) }.sort().each { println it } 
} 
  1. पेड़ ठीक है, लेकिन केवल फ़ाइल (पत्ती) पथ शामिल
  2. मैं सिर्फ सरल CLE प्राप्त नहीं कर पा रहे हालांकि निर्देशिकाओं (संदर्भ) की एक सूची। मैंने कई अन्य रूपों (पेड़, शामिल/बहिष्कृत) की कोशिश की, लेकिन मुझे या तो उस निर्देशिका में एक फ़ाइल मिलती है, निर्देशिका का नाम स्वयं या कुछ नहीं। मैं बस 'परिसंपत्तियों' डीआईआर में मिली निर्देशिकाओं की एक साधारण सूची चाहता हूं।
  3. अभी के लिए मैं बस पथ मुद्रित करने की कोशिश कर रहा हूं, लेकिन मैं इसे बाद में फ़ाइल में लिखने का उचित तरीका जानना चाहूंगा (जैसे एएनटी की गूंज फ़ाइल)।

    अद्यतन:
    यह ग्रूवी टुकड़ा उस हिस्से (+ SVN फिल्टर) कर रहा है, लेकिन मैं नहीं बल्कि इस कार्य को करने का एक और अधिक "Gradley" रास्ता खोजने चाहते हैं। यह एक पूर्व संस्करण निर्भरता के रूप में बाद में एक निर्माण संस्करण के संदर्भ में चलाता है। (नोट: मैं के बाद से मुझे लगता है मैं इस काम के लिए है कि परियोजना के संदर्भ में नहीं कर रहा हूँ इस हैक में पथ के भाग के रूप 'प्रोजेक्ट' को निर्दिष्ट करने के लिए किया था)

    def list = [] 
    def dir = new File("Project/assets") 
    dir.eachDirMatch (~/^(?!\.svn).*/) { file -> 
        list << file 
    } 
    
    list.each { 
        println it.name 
    } 
    

उत्तर

6

ठीक है, यह वह जगह है अब तक का सबसे साफ तरीका मिला।

यदि फ़ाइलट्री संग्रह पैटर्न ऐसा करने में सक्षम थे तो भी मैं खुश रहूंगा, लेकिन यह लगभग संक्षिप्त है, और यहां तक ​​कि थोड़ा और स्पष्ट और स्वयं व्याख्यात्मक भी हो सकता है।

कुंजी मैं संस्करण का निर्माण प्रति वास्तविक संपत्ति इंडेक्स फ़ाइल लेखन के रूप में कार्य संदर्भ और प्रासंगिक बनाने के कदम पर जोड़ने निर्भरता जोड़ दिया है, साथ ही relativePath साथ fileTree.visit उपयोग कर रहा है (नीचे देखें)
एक अतिरिक्त के रूप में,।

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

android { 

task indexAssets { 
    description 'Index Build Variant assets for faster lookup by AssetManager later' 

    ext.assetsSrcDir = file("${projectDir}/src/main/assets")   
    ext.assetsBuildDir = file("${buildDir}/assets") 

    inputs.dir assetsSrcDir 
    //outputs.dir assetsBuildDir 

    doLast { 
     android.applicationVariants.each { target -> 
      ext.variantPath = "${buildDir.name}/assets/${target.dirName}" 
      println "copyAssetRec:${target.dirName} -> ${ext.variantPath}" 

      def relativeVariantAssetPath = projectDir.name.toString() + "/" + ext.variantPath.toString() 
      def assetIndexFile = new File(relativeVariantAssetPath +"/assets.index") 
      def contents = "" 

      def tree = fileTree(dir: "${ext.variantPath}", exclude: ['**/.svn/**', '*.index']) 

      tree.visit { fileDetails -> 
       contents += "${fileDetails.relativePath}" + "\n" 
      } 

      assetIndexFile.write contents 
     } 
    } 
} 

indexAssets.dependsOn { 
    tasks.matching { task -> task.name.startsWith('merge') && task.name.endsWith('Assets') } 
} 

tasks.withType(Compile) { 
    compileTask -> compileTask.dependsOn indexAssets 
} 

    ... 
} 
+0

यह दुर्भाग्य नहीं रह गया है Gradle 2.0 – Adam

+0

उपयोग tasks.withType (JavaCompile) tasks.withType (संकलित) के बजाय साथ संकलित यह Gradle 2.x –

+0

साथ काम करने के लिए आप फ्लश और फ़ाइल को बंद करने के लिए भूल नहीं हैं ? –

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