在gradle中没有遵循语句执行顺序?

时间:2017-01-18 16:43:29

标签: gradle android-gradle

我需要将文件名从Android应用程序变体传输到Maven发布工件。我的build.gradle中的构造是:

<system.webServer>
   <security>
      <requestFiltering>
         <denyUrlSequences>
            <add sequence="bad" />
            <add sequence="sequence" />
         </denyUrlSequences>
         <alwaysAllowedUrls>
            <add url="/bad_sequence.txt" />
         </alwaysAllowedUrls>
      </requestFiltering>
   </security>
</system.webServer>

此脚本未部署任何工件,并且它产生的输出看起来像是机器的增加:

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()
      }
    }
  }
}

所以所有文件都很好地迭代,但由于某种原因,最后一个print语句在终端打印语句之前运行,所有构造只返回空列表。

为什么会发生这种情况,以及如何解决这个问题?我需要为Maven发布设置迭代文件列表和工件属性。

1 个答案:

答案 0 :(得分:1)

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

1)脚本按照编写顺序进行评估。这就是Gradle如何了解脚本中的任务以及要加载的插件。并非那些任务本身不会在那时被执行。

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

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

3a)任务他们按以下顺序运行。首先执行doFirst {}块,然后执行任务主体,然后执行doLast {}阻止。

因此,在您的情况下,如果要编写工件列表,则应将迭代器括在doFirst {}块中。