如何在插件列表的特定插件之后添加我自己的插件任务?

时间:2017-07-02 14:36:46

标签: gradle vaadin

考虑以下构建管道:

15:21:50: Executing external task 'build'...
Hello from the GreetingPlugin
:compileKotlin UP-TO-DATE
:compileJava NO-SOURCE
:copyMainKotlinClasses UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:findMainClass
:jar
:bootRepackage
:assemble
:compileTestKotlin UP-TO-DATE
:compileTestJava NO-SOURCE
:copyTestKotlinClasses UP-TO-DATE
:processTestResources NO-SOURCE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build

BUILD SUCCESSFUL

我需要编译一些位于以下位置的SaaS主题:

src/main/resources/VAADIN/themes/customtheme/customtheme.scss

在dir中的相应.css版本。

我认为我需要制作一些必须执行的gradle插件:

之间:jar和:bootRepackage以便我的.css最终在.jar中结束。

到目前为止,我有这个片段:

apply plugin: 'kotlin'
apply plugin: 'kotlin-spring'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: GreetingPlugin


class GreetingPlugin implements Plugin<Project> {
    void apply(Project project) {
        project.task('hello') {
            println "Hello from the GreetingPlugin"
        }
    }
}

但我们可以看到GreetingPlugin似乎是先执行的。有没有办法可以插入我的插件来在构建管道中的特定点执行?例如,现有列出的插件如何知道它们必须执行的顺序?

1 个答案:

答案 0 :(得分:1)

Gradle区分配置阶段执行阶段。您的完整构建脚本在配置阶段中执行,并且在应用插件时会直接调用插件的apply方法。在执行阶段 Gradle执行任务操作,doFirstdoLast关闭您列为命令行参数及其任务依赖关系的所有任务。

您的插件创建的任务hello根本没有执行,只是配置了!在任务配置期间,输出将打印到命令行。要将println命令移至执行阶段,请尝试以下代码:

project.task('hello') {
    doFirst {
        println "Hello from the GreetingPlugin"
    }
}

这样,您就不会看到命令行输出,因为任务仍然无法执行。您可以通过使用gradle命令指定任务名称来执行它,例如gradle hellogradle build hello。要将任务的执行绑定到另一个任务,您可以使用dependsOn方法:

project.tasks['jar'].dependsOn('hello')

请注意,如果您的插件应用于不提供jar任务的项目,则此方法将失败。在最终实现中,您应该尝试集成更多故障安全任务依赖项。