繁体   English   中英

如何在Gradle插件中动态创建任务?

[英]How to dynamically create a task in gradle plugin?

我正在开发gradle插件,并且在尝试动态创建任务时遇到问题。

这是我的代码段:

apply plugin: BootstrapPlugin

bootstrapConfig {
    basedir = "C:/temp/unzip"
    componentList = [
        [
            zipName: "test1",
            zipVersion: "_2",
            zipNetworkLocation: "temp",
            zipUnpackLocation: "${basedir}"
        ],
        [
            zipName: "test2",
            zipVersion: "_1",
            zipNetworkLocation: "temp",
            zipUnpackLocation: "${basedir}"
        ]
    ]
}

class BootstrapPlugin implements Plugin<Project> {
    void apply(Project project){
        project.extensions.create("bootstrapConfig",BootstrapConfigPluginExtension)
        project.task("unzipAll", dependsOn: project.tasks.matching { Task task -> task.name.startsWith("unzipSingle")}){
           println "DOIT!"
        }

        project.bootstrapConfig.componentList.each { element ->
            project.task "unzipSingle${element.zipName}" (type: Copy)   {
                def artifactFile = new File(project.bootstrapConfig.shareUrl + "/" + element.zipNetworkLocation + "/" + element.zipName + element.zipVersion + ".zip")
                def pathDestination = element.zipUnpackLocation + "/" + element.zipName + element.zipVersion
                def touchFileName = pathDestination + "/" + element.zipName + element.zipVersion + ".pid"
                from project.zipTree(artifactFile)
                into pathDestination
            }
        }
    }
}

class BootstrapConfigPluginExtension {
    String basedir
    def componentList = []
}

当我尝试运行它时,问题是我尝试创建的任务都不存在。 运行unzipAll它只运行该任务,因为它与其他任务无关。

我做错了什么?

这是怎么回事:

  1. 所有脚本语句均按声明顺序进行解析。
  2. apply plugin: BootstrapPlugin被执行。
  3. 在应用BootstrapPlugin时, bootstrapConfig关闭尚未解析。 由于未解析,因此BootstrapPlugin对配置一无所知,并遍历空集合。
  4. bootstrapConfig关闭在没有用时会被解析。

解决方案是在afterEvaluate块中创建动态任务:

apply plugin: BootstrapPlugin

bootstrapConfig {
    basedir = 'C:/temp/unzip'
    shareUrl = 'http://lol.com'
    componentList = [
        [
            zipName: "test1",
            zipVersion: "_2",
            zipNetworkLocation: "temp",
            zipUnpackLocation: "${basedir}",
        ],
        [
            zipName: "test2",
            zipVersion: "_1",
            zipNetworkLocation: "temp",
            zipUnpackLocation: "${basedir}",
        ],
    ]
}

class BootstrapPlugin implements Plugin<Project> {
  void apply(Project project){
    project.extensions.create('bootstrapConfig', BootstrapConfigPluginExtension)
    project.afterEvaluate {
      project.task("unzipAll", dependsOn: project.tasks.matching { Task task -> task.name.startsWith("unzipSingle")}){
        println "DOIT!"
      }

      project.bootstrapConfig.componentList.each { element ->
        project.task("unzipSingle${element.zipName}",type: Copy) {
          def artifactFile = new File(project.bootstrapConfig.shareUrl + "/" + element.zipNetworkLocation + "/" + element.zipName + element.zipVersion + ".zip")
          def pathDestination = element.zipUnpackLocation + "/" + element.zipName + element.zipVersion
          def touchFileName = pathDestination + "/" + element.zipName + element.zipVersion + ".pid"
          from project.zipTree(artifactFile)
          into pathDestination
        }
      }
    }
  }
}

class BootstrapConfigPluginExtension {
    String basedir
    String shareUrl
    def componentList = []
}

现在任务确实存在并且可以运行,但是它们不会与gradle tasks一起列出。

是演示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM