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

检查后在Gradle插件中运行任务,gradle,build.gradle,Gradle,Build.gradle,我在Groovy的buildSrc下编写了一个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" /

我在Groovy的
buildSrc
下编写了一个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')
        }
    }
}
不幸的是,我没有看到它运行,即,
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
如果有任何帮助或指点,我将不胜感激


Edit:由于M.Ricciuti评论了以下顺序事项,因此我将
test.SamplePlugin
移到插件
java
之后。否则,请遵循lu.koerfer使用
pluginManager
的解决方案

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

尝试直接执行“gradle sample”:您将看到它将触发它的执行,并根据您在插件中定义的约束首先执行“check”任务

如果您希望在每次执行“构建”任务时都执行“示例”任务,那么只需在插件中的“构建”和“示例”任务之间设置一个“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

        }
    }
}

方法
mustRunAfter
应该runafter
只定义执行顺序,而不是因果关系。这意味着它们不会导致执行任务。但是如果执行了两个任务,将考虑指定的顺序

要指定任务相关性,请使用
dependsOn
finalizedBy

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

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

好的,您仍然需要
mustRunAfter
语句,否则
sample
可能会在一开始就运行。另外,如果只运行
check
,而不是完整的
build
sample
将不会运行。您是对的,但我回答的要点是解释为什么
sample
任务没有用他当前的脚本执行,并基于
dependsOn
API为他提供解决方案,以正确实现他的需求。不清楚他真正想要实现什么(让
sample
task在
build
task之后运行,或者在
check
task之后运行),但他可以实现他想要的方式。您提出的解决方案基于
finalizedBy()
,我认为这也很好(我投了赞成票:),即使这仍然是孵化功能。谢谢。不幸的是,这对我不起作用
project.getTasks()
只有一个任务
sample
,因此我得到一个错误,无法在null对象上调用dependsOn()方法非常奇怪:您应用了插件“java”,因此您的项目应该有java插件公开的所有任务。。你能试着先应用java插件,然后再应用SamplePlugin吗?我想订单很重要,谢谢。我认为这应该是
project
,也就是说,没有s,因为有了s,我就得到了一个例外。无论如何,在这一点上,
project.tasks
似乎只有一个task
sample
,因此在根项目“tentest”中找不到名为“check”的任务时会出错。如果您有任何想法,我将不胜感激。请参阅我最后对另一个答案的评论:您需要按照正确的顺序应用插件:首先是Java,然后是SamplePlugin。您永远不应该按照插件必须应用的顺序定义需求。相反,请使用
PluginManager
及其
withPlugin
方法来确保应用了特定的插件。谢谢。使用
pluginManager
可以确保这不依赖于插件应用程序的顺序。我希望这个解决方案能与上面M.Ricciuti提供的解决方案合并。
void apply(Project project) {
        // task 'sample' def ...
        // ... 

        project.configure(project) {
            project.afterEvaluate {
                sample.mustRunAfter('check')
                project.getTasks().findByName('build').dependsOn(sample)
            }
        }
project.pluginManager.withPlugin('java') {
    project.tasks.getByName('check').finalizedBy('sample');
}