Запустите задачу в Gradle Plugin после проверки - PullRequest
0 голосов
/ 29 августа 2018

Я написал плагин Gradle в Groovy под buildSrc как:

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. В противном случае, пожалуйста, следуйте lu.koerfer s решению использовать pluginManager.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Методы mustRunAfter и shouldRunAfter определяют только порядок выполнения, а не причинность. Это означает, что они не вызовут выполнение задачи. Но , если обе задачи выполнены, указанный порядок будет учтен.

Чтобы указать зависимость задачи, используйте dependsOn или finalizedBy:

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

Это приведет к запуску sample каждый раз, когда check запускает , а гарантирует, что он будет работать после check.

0 голосов
/ 29 августа 2018

В вашем плагине вы создаете новую задачу «образец» и устанавливаете ограничение «образец должен выполняться после проверки»: но это не включает образец задачи в граф задач. В нем просто сказано: «если задачи выборки и проверки выполнены, то задача проверки должна быть выполнена первой». Поэтому, если вы просто выполните 'сборку Gradle', это не приведет к выполнению задачи "sample".

Попробуйте выполнить непосредственно «образец gradle»: вы увидите, что он запустит его выполнение, и сначала выполните выполнение задачи «check» в отношении противоречия, которое вы определили в плагине.

Если вы хотите, чтобы «примерная» задача выполнялась каждый раз при выполнении задачи «сборка», то просто установите ограничение «зависящий от» между «сборкой» и «примерными» задачами в вашем плагине:

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)
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...