【问题标题】:get two tasks to apply plugin gradle获得两个任务来应用插件 gradle
【发布时间】:2017-04-18 13:37:19
【问题描述】:

有没有办法在 gradle 中有两个任务,并在插件中返回正确的值设置参数

我有:

Build.gradle

apply plugin: 'gradle.plugin'

task FirstTask(type: com.nav.Coding){
  param.dictFile = file ("${projectDir}/src/main/resources/customized_struct.xml")
  param.outputDirectory = file("${buildDir}/generated/"
}

task SecondTask(type: com.nav.Coding){
  param.dictFile = file("${projectDir}/src/main/resources/customized_struct_two.xml")
  param.outputDirectory = file("${buildDir}/generated/"
}

由于某种原因,在将参数设置为 JVM 并处理自定义插件时,我的输出仅采用第二个 dictFile 而不是第一个。

命令输出

$ gradle -q FirstTask SecondTask

:com:nav:Coding:FirstTask
Processing C:\dev\src\main\resources\customized_struct_two.xml
This is my output dictFile C:\dev\src\main\resources\customized_struct_two.xml
This is my output outputDirectory C:\dev\build\generated

:com:nav:Coding:SecondTask
Processing C:\dev\src\main\resources\customized_struct_two.xml
This is my output dictFile C:\dev\src\main\resources\customized_struct_two.xml
This is my output outputDirectiory C:\dev\build\generated

BUILD SUCCESSFUL

Total time: 12.79 secs

【问题讨论】:

  • 什么是param?一些全局配置对象?
  • 这是在我的 groovy 类中创建的插件名称project.getExtensions().create("param",Coding.ParamPluginExtension.class)
  • 两个任务都输出到${buildDir}/generated,所以这可能会导致问题。要么输出到每个任务的单独目录,要么确保 com.nav.CodingTaskOutputs 精确到确切的文件(而不是目录)
  • @LanceJava 我的插件利用dictFile xml 并根据 xml 中的值生成代码。我想在同一目录中输出生成的文件...当我注释掉其中一个任务时,它会在${buildDir}/generated 中生成类,反之亦然(其他注释掉)我觉得我的问题是第二个任务优先并在插件上设置参数 vs 第一个任务完成,然后使用第二个字典文件

标签: gradle plugins


【解决方案1】:

我相信您犯了将逻辑置于configuration 阶段而不是execution 阶段的常见错误。我相信你想:

task FirstTask(type: com.nav.Coding){
    doFirst {
        param.dictFile = file ("${projectDir}/src/main/resources/customized_struct.xml")
        param.outputDirectory = file("${buildDir}/generated/"
    }
}

task SecondTask(type: com.nav.Coding){
    doFirst {
        param.dictFile = file("${projectDir}/src/main/resources/customized_struct_two.xml")
        param.outputDirectory = file("${buildDir}/generated/"
    }
}

这对我来说很奇怪

  1. param 来自哪里?
  2. 为什么com.nav.Coding 任务中没有dictFileoutputDirectory 属性?

【讨论】:

  • 这成功了!但我想知道为什么添加 doFirst 会给我想要的结果...
  • Gradle 有一个configuration 阶段和一个execution 阶段。您在configuration 阶段拥有逻辑,该阶段在执行任何任务之前运行。 doFirstdoLast 闭包在 execution 阶段执行......当任务实际运行时。尝试在您的配置旁边添加 println 语句,您就会明白我的意思
  • 太棒了!...感谢您的回复和澄清!
  • 对不起...param 来自我在 groovy 类文件中创建的插件名称...我使用它来限定我为 quickfixJ 代码生成器设置的属性... dictFile and outputDirectory` 在我的属性中,但我将覆盖它们以根据我想基于运行时提供的属性创建类
  • 清如泥。您应该将这些属性添加到任务本身。然后您可以在配置阶段进行初始化,因为每个任务实例都有自己的值。你在做什么是hacky
猜你喜欢
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多