检查后在Gradle插件中运行任务

时间:2018-08-29 03:20:19

标签: gradle build.gradle

我已经在buildSrc下用Groovy编写了Gradle插件:

package test

import org.gradle.api.Plugin
import org.gradle.api.Project

class SamplePlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        println "This line prints" //Just for Configuration. This prints
        def sample = project.tasks.create("sample") {
            doLast {
                println "This line does not print" 
            }
        }
        project.configure(project) {
            sample.mustRunAfter('check')
        }
    }
}

在这里,我正在尝试在sample的末尾运行build任务,所以我要在check之后运行它。

我现在尝试在看起来如下的项目build.gradle文件中调用它:

buildscript {
    repositories {
        mavenLocal()
        mavenCentral()
    }
}

apply plugin: 'java'
apply plugin:'application'
apply plugin: test.SamplePlugin

repositories {
    mavenLocal()
    mavenCentral()
}

mainClassName = "test.Widget"

不幸的是,我没有看到它运行,即doLast中的代码未出现在输出中,但是配置代码却出现了:

:buildSrc:compileJava NO-SOURCE
:buildSrc:compileGroovy
:buildSrc:processResources UP-TO-DATE
:buildSrc:classes
:buildSrc:jar
:buildSrc:assemble
:buildSrc:compileTestJava NO-SOURCE
:buildSrc:compileTestGroovy NO-SOURCE
:buildSrc:processTestResources NO-SOURCE
:buildSrc:testClasses UP-TO-DATE
:buildSrc:test NO-SOURCE
:buildSrc:check UP-TO-DATE
:buildSrc:build
This line prints
:compileJava UP-TO-DATE
:processResources NO-SOURCE
:classes UP-TO-DATE
:jar UP-TO-DATE
:startScripts UP-TO-DATE
:distTar UP-TO-DATE
:distZip UP-TO-DATE
:assemble UP-TO-DATE
:compileTestJava NO-SOURCE
:processTestResources NO-SOURCE
:testClasses UP-TO-DATE
:test NO-SOURCE
:check UP-TO-DATE
:build UP-TO-DATE

BUILD SUCCESSFUL in 1s
5 actionable tasks: 5 up-to-date

如果有任何帮助或建议,我将不胜感激

编辑:正如 M.Ricciuti 在下面的订单事项中所述,我将test.SamplePlugin移到了插件{{ 1}}。否则,请遵循 lu.koerfer 使用java的解决方案。

2 个答案:

答案 0 :(得分:1)

在您的插件中,您将创建一个新任务'sample'并设置一个约束“ sample必须在检查后运行”:但这在任务图中未包括sample任务。它只是说:“如果同时执行样本和检查任务,那么必须先执行检查任务”。因此,如果仅执行“ gradle build”,则不会触发任务“ sample”的执行。

尝试直接执行“渐变样本”:您将看到它会触发其执行,并首先针对您在插件中定义的约束执行“检查”任务。

如果您希望每次执行“ build”任务时都执行“ sample”任务,则只需在插件中的“ build”和“ sample”任务之间设置“ dependsOn”约束即可:

class SamplePlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        println "This line prints" //Just for Configuration. This prints
        def sample = project.tasks.create("sample") {
            doLast {
                println "This line does not print"
            }
        }
        project.configure(project) {
            sample.mustRunAfter('check')
            project.getTasks().findByName('build').dependsOn(sample) // <== set this contraint

        }
    }
}

EDIT :为了避免依赖插件的应用顺序,可以将任务依赖项声明包装在“ afterEvaluate”块中:

void apply(Project project) {
        // task 'sample' def ...
        // ... 

        project.configure(project) {
            project.afterEvaluate {
                sample.mustRunAfter('check')
                project.getTasks().findByName('build').dependsOn(sample)
            }
        }

答案 1 :(得分:1)

方法mustRunAftershouldRunAfter仅定义执行顺序,而非因果关系。这意味着它们不会导致任务被执行。但是如果这两个任务都执行,则将考虑指定的顺序。

要指定任务依赖性,请使用dependsOnfinalizedBy

project.pluginManager.withPlugin('java') {
    project.tasks.getByName('check').finalizedBy('sample');
}

这将导致sample每次check运行时都运行,并且确保它在check之后运行。