使用 gradle 插件配置另一个 gradle 插件

Use gradle plugin to configure another gradle plugin

我想实现一个 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
}

我希望任务构建 returns 1.1.1 而不是 unspecified 但我认为以这种方式不可能。我希望有人能给我指出正确的方向。

谢谢!

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

上述问题的解决方案如下所示:

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