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

时间:2015-03-20 17:51:59

标签: gradle gradle-plugin

编辑:我在考虑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

2 个答案:

答案 0 :(得分:0)

试试这个:

定义一个名为&#34; myext&#34;的实例变量,类型为&#34; MyExt&#34;。

在&#34; apply&#34;方法,这样做:

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

在&#34; getTarget&#34;方法,返回&#34; myext.target&#34;。

答案 1 :(得分:0)

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

1)在gradle构建任务中,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]
    }
}