2013-09-02 19 views
5

:Android + Gradle: bir dosyaya liste dizinleri ben Gradle bir ANT yapı içinde var bir görevi dönüştürmek çalışıyorum

<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"/> 

Tamamen temel Gradle kavramlarını kavrayamıyorsun ben hâlâ sanırım, ama burada denedim ne:

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. ağaç iyi, ama sadece dosya (yaprak) yollarını içeren
  2. sadece basit cle almak gibi olamaz Yine de dizinlerin bir listesi (bağlamlar). Diğer varyantları denedim (tree, include/exclude), ama bu dizinde tek bir dosya, dizin adı veya hiçbir şey olsun. Sadece varlıklar dizininde bulunan basit bir dizin listesi istiyorum.
  3. Şimdilik sadece yolları yazdırmaya çalışıyorum, ancak bunları bir dosyaya (ANT'nin eko dosyası gibi) yazmanın uygun yolunu da bilmek istiyorum.

    Güncelleme:
    Bu harika pasajı o kısmı (+ svn filtresi) yapmak gibi görünüyor, ama yerine bu görevi yapmanın daha "Gradley" yolunu bulurdum. Önceden oluşturulmuş bir bağımlılık olarak daha sonra bir yapı varyantı bağlamında çalışır. (NOT:? Ben görev için o proje bağlamında değilim sanırım çünkü bu kesmek yolun bir parçası olarak 'Projesi' belirtmek zorunda)

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

cevap

6

Tamam, budur Şimdiye kadar bulduğum en temiz yol.

Eğer FileTree toplama kalıpları bunu yapabilseydi, yine de daha mutlu olurdum, ama bu neredeyse özlü ve belki biraz daha açık ve kendini açıklayıcı.

Anahtar, relativePath ile fileTree.visit kullanıyor (aşağıya bakın)
Ek olarak, görev yapısı ekledim ve ilgili yapı adımına bağımlılık ekledim, ayrıca varyant oluşturma başına gerçek varlıklar indeks dosyasını yazdım.

Bu neden gerekli, soruyorsunuz? AssetManager çok yavaş olduğundan, bkz. here ve aşağıdaki yanıt dizisi (orijinal ANT hedefini tetikleyen).

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

Bu maalesef artık Gradle 2.x – Adam

+0

kullanım tasks.withType (JavaCompile) ile derler sifonu ve dosyayı kapatmak unutmak değildir ? –

+0

ile çalışması için yerine tasks.withType (Derleme) ait Gradle 2.0 –

İlgili konular