【问题标题】:How to use gradle extension correctly in plugins using GradleBuild task?如何在使用 GradleBuild 任务的插件中正确使用 gradle 扩展?
【发布时间】:2015-03-20 17:51:59
【问题描述】:

编辑:考虑到 David M. Karr 的提议,我重新表述了我的问题。

我正在编写一个 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 的值?

我正在使用 gradle 2.3

【问题讨论】:

    标签: gradle gradle-plugin


    【解决方案1】:

    试试这个:

    定义一个名为“myext”的实例变量,类型为“MyExt”。

    在“应用”方法中,这样做:

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

    在“getTarget”方法中,返回“myext.target”。

    【讨论】:

    • 这里的问题是root gradle build中配置的值没有考虑进去。如果我使用param.setProjectProperties([target:myext.target]),则使用目标的初始值,而不是使用插件在构建文件中指定的值。而且我不能使用可以解决我的问题的闭包。还有其他想法吗?
    【解决方案2】:

    我已经成功地使用 project.afterEvaluate 方法获得了我想要的东西。 Thanks to this question

    1) 在 gradle build 任务中,startParameter.projectProperties 正在等待地图,而不是关闭。因此,为惰性定义设置闭包的想法行不通。

    2) 如果我直接在我的插件中引用mExt.targetproject.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]
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多