【问题标题】:Gradle myCustomTask - How to avoid calling dependents tasks by passing command line argumentsGradle myCustomTask - 如何通过传递命令行参数来避免调用依赖任务
【发布时间】:2015-07-30 20:58:22
【问题描述】:

我在 Gradle (2.3) 中有一个自定义任务

task myCustomTask (dependsOn: [ jacocoTestReport ]) << {

   //Adding this didn't work, gives an error that options is not a property.
   //options.compilerArgs = ["-x compileJava -x classes -x test -x testClasses"]

   //Seems like the following line actually works!!! but still errors for "options" property. Strange!!
   //myCustomTask.options = [ "-x compileJava -x classes -x test -x testClasses" ]

   //..
   //...some...operation
   //..
}

如何在 Gradle 中更改上述自定义任务代码,以便它可以在命令行中执行我正在执行的操作。我希望当有人调用 myCustomTask 并且它依赖于 Gradle 的任何核心任务(如 compileJava、类等)时,它不应该调用这些任务(即 mimic -x someTask 命令行中的行为)。

以下作品!!

$ gradle jacocoTestReport -x compileJava -x classes -x test -x testClasses

然后,我想要的是:运行 gradle myCustomTask 应该做同样的事情(上面的命令行命令正在做的事情)。

错误:

:compileJava UP-TO-DATE
:compileGroovy UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jacocoTestReport
:myCustomTask FAILED

FAILURE: Build failed with an exception.

* Where:
Initialization script '/home/giga/gradle-2.3/init.d/extra1.common-thids.gradle' line: 450

* What went wrong:
Execution failed for task ':myCustomTask'.
> No such property: options for class: org.gradle.api.DefaultTask_Decorated
  Possible solutions: actions

cat -n 在 extra1..gradle 文件(init.d 级别文件)上:

   449     task myCustomTask (dependsOn: [ jacocoTestReport ]) << {
   450          myCustomTask.options = [ " -x compileJava -x classes -x test -x testClasses " ]
   451     }

【问题讨论】:

    标签: command-line gradle task gradle-2


    【解决方案1】:

    我认为这就是你想要的:

    • 运行测试,生成 JaCoCo 报告并(可选)对报告执行某些操作。
    • 对 JaCoCo 报告执行某些操作,而无需再次运行测试。

    我认为最好的办法是查看mustRunAfter 而不是dependsOnhttps://docs.gradle.org/2.3/userguide/more_about_tasks.html#sec:ordering_tasks

    task myCustomTask() {
        mustRunAfter jacocoTestReport
        doLast {
            ...
        }
    }
    

    切换到mustRunAfter可以做什么?

    运行测试并立即使用 JaCoCo 报告。 Gradle 将确保 myCustomTask 在 JaCoCo 报告任务之后运行,因此您可以确保您的自定义任务看到最新的 JaCoCo 输出:

    gradle jacocoTestReport myCustomTask
    

    使用之前生成的 JaCoCo 报告。 jacocoTestReport 不是myCustomTask 的依赖项,所以jacocoTestReport 和它所依赖的任务不会被添加到任务图中并且不会运行。只会运行myCustomTask

    gradle myCustomTask
    

    【讨论】:

    • 谢谢约翰。这不是我想要的。我想如何“不调用”一些核心任务(在调用自定义任务时),这些任务依赖于另一个依赖于我的自定义任务的核心任务。
    • 好的,我发现了一些东西并更新了关于我的发现的问题,以更好地展示它在做什么。错误消失后,我似乎接近了我想要的。
    • 你想要的不是一个好主意。您正在尝试使用 Gradle 做一些 Gradle 明确设计不做的事情:构建不可靠的混乱。我强烈建议你不要继续你要去的方向。告诉我们您为什么不希望运行 jacocoTestReport 所依赖的任务。并且options 并非适用于每个任务,即使它适用于您的任务,您也无法以这种方式添加其他排除项,因为这些是 Gradle 命令行参数并且它们已经被解析并且不会再次解析。
    • 我有情况! myCustomTask 基本上在其中运行 jacocoTestReport 和“sonarRunner”。因此,如果我在 Gradle 中调用 myCustomTask,它将同时运行这两个任务。好的。现在,我有 400 多个项目使用 Java6,7,一些新升级的项目使用 Java8。我们已将 Jenkins 作业全部设置为在 Invoke Gradle 中调用 myCustomTask。我发现如果至少不使用 JDK7/8 运行 SonarQube 实例,则无法发布。如果您使用 Java7 运行 myCustomTask,则 myCustomTask 中的 jacocoTestReport 任务不会为 JDK8 项目生成 jacoco 报告(因为类是 JDK8)。
    • 所以你想要的是:使用 Java 8 运行 Gradle,并使用 Java 6 或 7 编译一些项目。你可以通过指定 CompileJava 任务的源(和目标)兼容性来做到这一点,然后在任务的options 对象中设置引导类路径。请参阅:stackoverflow.com/a/22681854/2622278 确保包含要编译的 JRE 中的所有相关 JAR。这里是options的文档:docs.gradle.org/current/dsl/…
    猜你喜欢
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 2021-03-31
    • 1970-01-01
    • 2021-12-28
    相关资源
    最近更新 更多