Используйте плагин Gradle для настройки другого плагина Gradle - PullRequest
0 голосов
/ 27 марта 2019

Я хочу реализовать плагин Gradle, который изменяет project.version в соответствии с конфигурацией плагина, а затем использует измененный project.version для настройки другого плагина Gradle, например, для построения контейнеров.Проблема состоит в том, что обе конфигурации оцениваются одновременно, и поэтому изменения в project.version не применяются во время настройки второго плагина.

Я ищу документацию Gradle, но ничего не нашел относительно моей проблемы.

build.gradle

class VersionPluginExtension {
    String major
    String minor
    String patch
}

class VersionPlugin implements Plugin<Project> {
    void apply(Project project) {
        def extension = project.extensions.create('versionPlugin', VersionPluginExtension)
        project.afterEvaluate {
            project.version = "${extension.major}.${extension.minor}.${extension.patch}"
        }
        project.task('showVersion') {
            doLast {
                println "${project.version}"
            }
        }
    }
}

class ContainerPluginExtension {
    String version
}

class ContainerPlugin implements Plugin<Project> {
    void apply(Project project) {
        def extension = project.extensions.create('containerPlugin', ContainerPluginExtension)
        project.task('build') {
            doLast {
                println "${extension.version}"
            }
        }
    }
}

apply plugin: VersionPlugin
apply plugin: ContainerPlugin

versionPlugin {
    major = '1'
    minor = '1'
    patch = '1'
}

containerPlugin {
    version = project.version
}

Я ожидаю, что сборка задачи вернет 1.1.1, а не unspecified, но я думаю, что это невозможно.Я надеюсь, что кто-то может направить меня в правильном направлении.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Решение проблемы выше выглядит так:

class VersionPluginExtension {
    String major
    String minor
    String patch
    private String version

    String getVersion() {
        if (!version)
            return "${major}.${minor}.${patch}"
        return version
    }
}

class VersionPlugin implements Plugin<Project> {
    void apply(Project project) {
        def extension = project.extensions.create('versionPlugin', VersionPluginExtension)

        project.task('showVersion') {
            doLast {
                println "${extension.version}"
            }
        }
    }
}

class ContainerPluginExtension {
    String version
}

class ContainerPlugin implements Plugin<Project> {
    void apply(Project project) {
        def extension = project.extensions.create('containerPlugin', ContainerPluginExtension)

        project.task('build') {
            doLast {
                println "${extension.version}"
            }
        }
    }
}

apply plugin: VersionPlugin
apply plugin: ContainerPlugin

versionPlugin {
    major = '1'
    minor = '1'
    patch = '1'
}

project.version = versionPlugin.version

containerPlugin {
    version = project.version
}

Результат:

> Configure project :
1.1.1

> Task :showVersion
1.1.1

> Task :build
1.1.1
0 голосов
/ 27 марта 2019

Переместите определение version из блока containerPlugin в определение плагина:

class ContainerPlugin implements Plugin<Project> {
    void apply(Project project) {
        def extension = project.extensions.create('containerPlugin', ContainerPluginExtension)
        project.afterEvaluate {
            extension.version = project.version
        }
        project.task('build') {
            doLast {
                println "${extension.version}"
            }
        }
    }
}

Результат:

$ gradle build

> Task :build
1.1.1
...