2017-01-18 5 views
0

Androidアプリケーションの亜種からMavenのパブリケーション成果物にファイル名を転送する必要があります。私のbuild.gradleでの構築物は、次のとおりです。文の実行順序がgradleで追跡されませんか?

publishing { 
    publications { 
    maven(MavenPublication) { 
     groupId android.defaultConfig.applicationId 
     artifactId 'apk' 
     version = project.ext.version 

     artifacts = { 
     def list = [] 
     android.applicationVariants.all { variant -> 
      variant.outputs.each { output -> 
       list.add (output.outputFile.absolutePath)  
       println "Output " + output.outputFile.absolutePath + " list " + list 
      } 
     }  
     println "To deploy " + list 
     list.iterator() 
     } 
    } 
    } 
} 

ませ遺物が今までにこのスクリプトを展開していない、そしてそれはマシンの昇給のような出力が生成されます。

To deploy [] 
Output B:\ox\app\build\outputs\apk\app-debug-1.0.apk list [B:\ox\app\build\outputs\apk\app-debug-1.0.apk]       
Output B:\ox\app\build\outputs\apk\app-release-1.0.apk list [B:\ox\app\build\outputs\apk\app-debug-1.0.apk, B:\ox\app\build\outputs\apk\app-release-1.0.apk] 

だから、すべてのファイルがうまくでした反復されますが、なんらかの理由で最後のprint文が端末のprint文の前で実行され、すべての構文が空のリストを返します。

なぜこれが起こり、これを修正するのですか? Mavenのパブリケーションの反復ファイルとアーティファクトプロパティのリストを設定する必要があります。

答えて

1

Gradleは宣言型言語なので、ステートメントの順序は重要ではありません。ビルドは次のように実行されます。

1)スクリプトは書かれた順に評価されます。これは、Gradleがあなたのスクリプトでどのようなタスクを持っているか、どのプラグインを読み込むかを調べる方法です。その時点でタスク自体は実行されません。

2)次に、Gradleは、実行する必要があるすべてのタスクのDAGを作成します。各タスクは、あらかじめ実行しなければならないタスクである依存関係を宣言できます。

3)DAGの作成後、タスクが実行されます。タスクは宣言された依存関係に従って実行されます。依存関係のないタスクが最初に実行され、おそらく並行して実行されます。依存関係を持つタスクは、すべての先行操作が完了した後に実行されるようにスケジュールされています。可能であれば、Gradleは物事を並行して実行します。

3a)タスクthemselevesは次の順序で実行されます。最初のdoFirst {}ブロックが実行され、その後にタスク本体が実行され、その後doLast {}ブロックが実行されます。

したがって、アーティファクトのリストを作成する場合は、イテレータをdoFirst {}ブロックに囲む必要があります。

関連する問題