2013-09-02 7 views
5

アンドロイド+のGradle:ファイルにリストディレクトリ私はGradleのにANTビルドを持っているタスクに変換しようとしている

<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を得るように見えることはできませんディレクトリ(コンテキスト)のリスト。私はいくつかの他の変種(ツリー、インクルード/除外)を試しましたが、そのディレクトリ内に1つのファイル、ディレクトリ名自体、または何も表示されません。私はちょうど '資産'ディレクトリにあるディレクトリの簡単なリストがほしい。
  3. 今のところ、私はパスを印刷しようとしていますが、後でANTのエコーファイルのようなファイルにこれらのファイルを書き込む正しい方法を知りたいと思います。

    更新:
    このグルーヴィーなスニペットはその一部(+ SVNフィルターを)やっているようだが、私はむしろ、この作業を行うためのより多くの「Gradley」方法を見つけるだろう。後でビルド前の依存関係としてビルドバリアントのコンテキストで実行されます。 (注:?私は私が仕事のために、そのプロジェクトのコンテキストではないと思うよので、このハックではパスの一部として、「プロジェクト」を指定する必要がありました)

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

答えて

6

[OK]を、これがあります今まで私が見つけた最もクリーンな方法です。

FileTreeの収集パターンがこれを行うことができたのであれば、私はもっと幸せですが、これはほぼ簡潔で、多少明示的で明白なものです。

fileTree.visitrelativePathを使用しています(下記参照)
さらに、タスクのコンテキストを追加し、関連するビルドステップに依存関係を追加し、バリアントビルドごとに実際のアセットインデックスファイルを作成しました。

これはなぜ必要なのですか? AssetManagerは非常に遅いため、hereとそれに続く応答スレッド(元のANTターゲットをトリガしたもの)を参照してください。

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.xの – Adam

+0

使用tasks.withType(JavaCompile)でコンパイルしないあなたは、ファイルをフラッシュし、閉め忘れていません? –

+0

で動作させるために代わりtasks.withType(コンパイル)のGradleの2.0 –

関連する問題