如何在使用GradleBuild任务的插件中正确使用gradle扩展?

如何在使用GradleBuild任务的插件中正确使用gradle扩展?,gradle,gradle-plugin,Gradle,Gradle Plugin,编辑:考虑到大卫·M·卡尔的提议,我重新措辞了我的问题 我正在写一个gradle插件。此插件正在启动一个扩展GradleBuild的任务。外部gradle构建文件需要一些信息作为参数。这些参数在项目扩展中给出 void apply(Project project) { project.extensions.create('myext',MyExt) project.task('myTask', type:GradleBuild){ buildFile = ge

编辑:考虑到大卫·M·卡尔的提议,我重新措辞了我的问题

我正在写一个gradle插件。此插件正在启动一个扩展GradleBuild的任务。外部gradle构建文件需要一些信息作为参数。这些参数在项目扩展中给出

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]
    }
}
插件代码

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"
}
外部渐变生成文件:

apply plugin : 'com.example.myplugin'

ext{
    target = "myTarget"
}
task build(){
    println project.target
}
如果我在
getTarget()
中放入闭包,
println project.target
显示闭包而不是字符串

如果我不关闭:

     // Problem here
    def getTarget(){
        return mExt.target
    }
然后我得到了“未初始化”而不是“我的目标”

如何在此处获取myext.target的值

我正在使用gradle 2.3,请尝试以下方法:

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

在“应用”方法中,执行以下操作:

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

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

在使用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]
    }
}

这里的问题是没有考虑在根梯度构建中配置的值。如果我执行
param.setProjectProperties([target:myext.target])
,则使用target的初始值,但不是使用插件在生成文件中指定的值。我不能用闭包来解决我的问题。还有别的想法吗?