Gradle 动态生成任务

标签 gradle

这是我第一次尝试使用 clojure,我试图在我的 build.gradle 文件中生成一些任务。我遇到了复杂性错误,例如:

* Where:

Build file '/Users/austin/Repositories/test/build.gradle' line: 47

* What went wrong:

A problem occurred evaluating root project 'test'. Cannot set the value of read-only property 'src' for task ':downloadDriverfirefox' of type de.undercouch.gradle.tasks.download.Download.



我相当肯定这只是我对 groovy 语言的缺乏经验,但我真的可以使用一些指示来指出我哪里出错了。
ext {
// The drivers we want to use
drivers = ["firefox", "chrome"]

driversSrc = [:]
driversSrc['firefox'] = 'https://github.com/mozilla/geckodriver/releases/download/v0.15.0/geckodriver-v0.15.0-macos.tar.gz'
driversSrc['chrome'] = 'https://chromedriver.storage.googleapis.com/2.29/chromedriver_mac64.zip'

driverDest = new File("${buildDir}/webdrivers")
}

import org.gradle.api.tasks.*
import de.undercouch.gradle.tasks.download.Download

driversSrc.each { driver, path ->
tasks.create(name: 'downloadDriver'+"${driver}", type: Download) {
    src = path
    dest ext.driverDest
    overwrite true
}
}

driversSrc.each {driver ->
tasks.create(name: 'unzipDriver'+"${driver}", dependsOn: 'downloadDriver'+"${driver}", type: Copy) {
    from zipTree(file('downloadDriver'+"${driver}").dest)
    into buildDir/'webdrivers'
}
}

最佳答案

我做过的事情:

  • 清理 map 以存储数据
  • 由于您正在使用此插件:https://github.com/michel-kraemer/gradle-download-task ,我必须确保正确使用任务
  • 既然你有 tar,你必须使用 tarTree以及 zipTree

  • 请试试这个:
    buildscript {
      repositories {
        jcenter()
      }
    
      dependencies {
        classpath "de.undercouch:gradle-download-task:3.2.0"
      }
    }
    
    allprojects {
      repositories {
        jcenter()
      }
    }
    import de.undercouch.gradle.tasks.download.Download
    
    apply plugin: "de.undercouch.download"
    
    ext {
      driversSrc = [
              "firefox": "https://github.com/mozilla/geckodriver/releases/download/v0.15.0/geckodriver-v0.15.0-macos.tar.gz",
              "chrome" : "https://chromedriver.storage.googleapis.com/2.29/chromedriver_mac64.zip"
      ]
      driverDest = "${buildDir}/webdrivers"
    }
    
    driversSrc.each { driver, path ->
      def fileDest = new File(driverDest, new File(path).getName())
    
      tasks.create(name: "downloadDriver${driver}", type: Download) {
        src path
        dest fileDest
        overwrite true
      }
    
      tasks.create(name: "unzipDriver${driver}", dependsOn: "downloadDriver${driver}", type: Copy) {
        from path.endsWith("zip") ? zipTree(file(fileDest)) : tarTree(file(fileDest))
        into driverDest
      }
    }
    

    运行任务:
    ./gradlew unzipDriverfirefox unzipDriverchrome*
    

    关于Gradle 动态生成任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43413532/

    相关文章:

    gradle - 在 Gradle 中多次调用 Zip 任务

    Android Studio 无法同步 Gradle 文件

    java - 让注释处理器根据 gradle 标志忽略文件

    gradle - 执行顺序问题

    gradle - Gradle插件兼容性-如何查找?

    java - 为什么我的 jar 库中有未解析的符号?

    android - 更新 android studio 后无法将请求的类放入单个 dex 文件中

    Jenkins + Gradle + Artifactory : Deploy only work once

    android - adt eclipse 和 libGDX android 启动器不工作

    java - Gradle 在 jar 文件中编译 .java ?