Как правильно использовать расширение gradle в плагинах с помощью задачи GradleBuild?

EDIT: я перефразировал свой вопрос, приняв во внимание предложение Дэвида М. Карра.

Я пишу плагин Gradle. Этот плагин запускает задачу, расширяющую GradleBuild. Внешнему файлу сборки Gradle нужна некоторая информация в качестве параметров. Эти параметры указаны в расширении проекта.

Код плагина

class MyPlugin implements Plugin<Project> {

    def mExt

    void apply(Project project) {

        mExt = project.extensions.create('myext',MyExt)

        project.task('myTask', type:GradleBuild){
            def param = new StartParameter()
            param.setProjectProperties([target:getTarget()])

            // Problem here
            startParameter = param
            buildFile = getMyBuildPath()
            tasks = [
                'build',
                'generateDebugJavadocJar'
            ]
        }
    }

    def getMyBuildPath(){
        ...
    }

    // Problem here
    def getTarget(){
        return {mExt.target}
    }
}

class MyExt {
    def String target = "uninitialised"
}

Файл сборки Gradle:

apply plugin : 'com.example.myplugin'

ext{
    target = "myTarget"
}

Внешний файл сборки Gradle:

task build(){
    println project.target
}

Если я помещу замыкание в getTarget(), println project.target покажет замыкание, а не строку.

Если я не поставлю закрытие:

     // Problem here
    def getTarget(){
        return mExt.target
    }

Затем я получил «неинициализированный» вместо «myTarget».

Как я могу получить здесь значение myext.target?

Я использую град 2.3


person Bipi    schedule 20.03.2015    source источник


Ответы (2)


Попробуй это:

Определите переменную экземпляра с именем «myext» и типом «MyExt».

В методе «применить» сделайте следующее:

myext = project.extensions.create('myext',MyExt)

В методе «getTarget» верните «myext.target».

person David M. Karr    schedule 20.03.2015
comment
Проблема здесь в том, что значение, настроенное в корневой сборке gradle, не учитывается. Если я делаю param.setProjectProperties([target:myext.target]), используется начальное значение target, а не то, которое указано в файле сборки с помощью плагина. И я не могу использовать замыкание, которое решило бы мою проблему. Любая другая идея? - person Bipi; 23.03.2015

Мне удалось получить то, что я хотел, используя метод project.afterEvaluate. Спасибо этот вопрос

1) В задаче сборки gradle startParameter.projectProperties ждет карту, а не закрытие. Таким образом, идея поставить закрытие для ленивого определения не может работать.

2) Если я прямо в своем плагине ставлю ссылку на mExt.target или project.myext.target, то устанавливается начальное значение. Значение, указанное в моем файле build.gradle, не используется, поскольку плагин уже оценен.

3) project.afterEvaluate() решить мою проблему. Закрытие завершает настройку myTask при использовании расширения проекта.

void apply(Project project) {

    project.extensions.create('myext',MyExt)

    project.task('myTask', type:GradleBuild){
        buildFile = getMyBuildPath()
        tasks = [
            'build',
            'generateDebugJavadocJar'
        ]
    }

    project.afterEvaluate { proj ->
        proj.myTask.startParameter.projectProperties = [target:proj.myext.target]
    }
}
person Bipi    schedule 23.03.2015