【问题标题】:Use gradle plugin to configure another gradle plugin使用 gradle plugin 配置另一个 gradle 插件
【发布时间】:2019-03-27 13:46:39
【问题描述】:

我想实现一个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,但我认为这是不可能的。我希望有人能指出我正确的方向。

谢谢!

【问题讨论】:

    标签: gradle groovy kotlin gradle-plugin


    【解决方案1】:

    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
    

    【讨论】:

    • 感谢我开发这两个插件的有效解决方案!但是如果第二个插件是通过扩展获取配置的第三方插件呢?没有办法订购插件执行吗?
    【解决方案2】:

    上述问题的解决方法如下:

    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
    

    【讨论】:

      猜你喜欢
      • 2020-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多