gradle中未遵循语句执行顺序?

gradle中未遵循语句执行顺序?,gradle,android-gradle-plugin,Gradle,Android Gradle Plugin,我需要将文件名从Android应用程序变体传输到Maven发布工件。my build.gradle中的结构是: publishing { publications { maven(MavenPublication) { groupId android.defaultConfig.applicationId artifactId 'apk' version = project.ext.version artifacts = {

我需要将文件名从Android应用程序变体传输到Maven发布工件。my build.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语句在terminal print语句之前运行,而all构造只返回空列表


为什么会发生这种情况,如何解决?我需要为Maven publication设置迭代文件列表和artifacts属性。

Gradle是一种声明性语言,因此语句顺序并不重要。构建以以下方式执行:

1) 脚本按编写顺序进行计算。这就是Gradle了解脚本中有哪些任务以及要加载哪些插件的方式。并不是说任务本身不会在那个时候执行

2) 然后Gradle构建了一个DAG,其中包含了所有需要执行的任务。每个任务都可以声明依赖项,这些依赖项是必须事先执行的任务

3) 构建DAG后,将运行任务。任务根据其声明的依赖项运行。没有依赖项的任务首先运行,可能并行运行。具有依赖关系的任务计划在其所有前置任务完成后运行。如果可能的话,Gradle也会并行运行

3a)任务本身按以下顺序运行。首先执行doFirst{}块,然后执行任务体,然后执行doLast{}块

因此,在您的例子中,如果您想要组成工件列表,您应该将迭代器封装到doFirst{}块中