如何使用'dependsOn'使Zip类型的任务执行?

时间:2018-07-16 21:52:16

标签: gradle

我试图使我的任务zipGui在构建目标上执行,但是似乎能够执行任务的唯一方法是从任务定义中删除(type: Zip)

此代码段根本无法执行zipGui任务:

task zipGui(type: Zip) {
  doFirst {
    println "==================== Zipping GUI components"
  }   

  doLast {
    FileTree zip = zipTree('assets/htdocs/gui.zip')
    from 'assets/htdocs'
  }   
}


build.dependsOn zipGui

这会执行zipGui,但对如何压缩文件一无所知:

task zipGui {
  doFirst {
    println "==================== Zipping GUI components"
  }   

  doLast {
    FileTree zip = zipTree('assets/htdocs/gui.zip')
    from 'assets/htdocs'
  }   
}


build.dependsOn zipGui

这是整个build.gradle的一部分。

如何让zipGui作为构建的依赖项执行?

编辑:以下是 real build.gradle的更多内容,无需我将内容剥离出来以简化问题:

  task copyCert(type: Copy) {
      from '../../../install'
      into 'assets/certs/root'
      include 'ca.pem'

      doFirst {
          println "==================== Copying root cert into assets"
      }
  }


  task copyGui(dependsOn: copyCert, type: Copy) {
      from '../../web/gui'
      into 'assets/htdocs'
      include '**/*.html'
      include '**/*.css'
      include '**/*.js'
      include '**/*.wav'
      include '**/*.tmpl'
      include '**/*.png'
      include '**/*.gif'
      include '**/*.jpg'
      exclude '**/*.DS_Store'
      exclude '**/.gitignore'
      exclude '**/.thumb'
      exclude '**/build'

      doFirst {
          println "==================== Copying gui components into assets"
      }
  }


  task zipGui(dependsOn: copyGui, type: Zip) {
      FileTree zip = zipTree('assets/htdocs/gui.zip')
      from 'assets/htdocs'

      doFirst {
          println "==================== Zipping GUI components"
      }
  }

2 个答案:

答案 0 :(得分:1)

在此处检查zip任务的详细信息:https://docs.gradle.org/current/dsl/org.gradle.api.tasks.bundling.Zip.html

      task zipGui(type: Zip) {
          archiveName = 'gui.zip'
          from("$projectDir/../../../install") {
              into 'assets/certs/root'
              include 'ca.pem'
          }
          from("$projectDir/../../web/gui"){
              into 'assets/htdocs'
              exclude '**/*.DS_Store'
              exclude '**/.gitignore'
              exclude '**/.thumb'
              exclude '**/build'
          }   // Just include or exclude is enough here as you indicated.
          destinationDir(file("$buildDir/libs"))
      }

答案 1 :(得分:0)

您的任务完全无关。

Gradle任务只有在有事情要做的情况下才会执行。如果无事可做(例如,没有要压缩的文件),则跳过任务。与任务无关的原因有多种。主要原因是最新的检查,以防止Gradle执行上次调用时所做的相同的事情,至少在任务输出仍然可用并且任务输入没有更改的情况下。

但是,在您的特定情况下,该任务无关紧要,因为在任务执行时,根本没有指定输入文件。您可以通过from添加要包含在zip文件中的文件。但是,您可以在doLast闭包内使用它,该闭包在执行任务操作(发生压缩的位置)之后执行。因此,在运行zip进程时,未进行配置。

您可以使用任务的常规配置闭包,甚至可以使用doFirst闭包来配置任务:

task zipGui(type: Zip) {
    from 'assets/htdocs'
}

// OR

task zipGui(type: Zip) {
    doFirst {
        from 'assets/htdocs'
    }
}

更多说明:

  • FileTree zip = zipTree('assets/htdocs/gui.zip')行绝对不执行任何操作,因为不查询创建的文件树。您需要手动访问文件树的文件,或者将其传递给任务,例如您的压缩任务:from zipTree('assets/htdocs/gui.zip')
  • 在第二个示例中,执行任务是因为对于正常任务,不会自动检查是否有任何工作要做,因为正常任务基本上可以完成用户所做的所有工作。
  • 我不太确定,但是我认为第二个示例应该抛出异常,因为没有类型的普通任务不会提供from方法。
  • 要获取每个已执行任务的状态以及更一般的了解,请使用命令行参数--console=plain。参数-d--stacktrace / --full-stacktrace可用于获取有关错误的更多信息。