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

问题描述 投票:1回答:2

我在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之后移动了java。否则,请遵循使用pluginManager的lu.koerfers解决方案。

gradle build.gradle
2个回答
1
投票

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

尝试直接执行“gradle 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

        }
    }
}

编辑:为了避免不得不依赖插件应用顺序,任务依赖声明可以包含在“afterEvaluate”块中:

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

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

1
投票

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

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

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

每次qazxsw poi运行时,这将导致qazxsw poi运行,并确保它在sample之后运行。

© www.soinside.com 2019 - 2024. All rights reserved.