gradle脚本中的嵌套动态属性?

时间:2016-06-10 07:17:08

标签: gradle

是否可以在gradle构建脚本中使用嵌套属性来对全局变量进行分组?

如果gradle.properties文件包含

mavenUpload.serverUrl=https://someServer.org/mavenrepository

我可以在像这个${mavenUpload.serverUrl}这样的gradle脚本中使用它吗?或者像这样?

// in master gradle.build
task uploadArchives {
    description = "Upload to maven repository '${mavenUpload.serverUrl}'."

    // call all uploadArchives in the sub projects
    dependsOn { subprojects.uploadArchives }
}

甚至可以动态创建像这样的嵌套属性

ext {
    mavenUpload {
        serverUrl='https://someServer.org/mavenrepository'
        login='myUsername'
        password='myTopSecretPassword'
    }
}

有没有办法在gradle中做类似的事情?

我目前的解决方法是使用下划线“_”而不是点“。”

我在gradle 2.13中尝试了什么

ext {
    // works as expected
    myglobal='my global value'

    // error :-(
    myGlobalNested1 {
        myNested='my nested value'
    }

    // error :-(
    myGlobalNested2.ext {
        myNested='my nested value'
    }

    // error :-(
    myGlobalNested4.ext.myNested='my nested value'

    // error :-(
    myGlobalNested5.myNested='my nested value'

    myGlobalNested3 = new HashMap<String,Object>()      

}

// error :-(
myGlobalNested3.ext.myNested='my nested value'

task demo {
    // works as expected
    ext.mylocal='my local value'

    print """
        myglobal = ${myglobal}
        mylocal = ${mylocal}
        demo.mylocal = ${demo.mylocal}

        myGlobalNested.myNested = ${myGlobalNested.myNested}
    """
}

[更新2016-06-11 @opal]

此脚本无法编译。 // error :-(的部分导致编译错误

2 个答案:

答案 0 :(得分:0)

我也在同一个问题上挣扎...

这怎么样?

ext {
    parent = ext {
        child = ext {
            grandChild = ext {
                greatGrandChild = "Kourtney"
            }
            grandChildBrother = "Khloé"
        }
        childSister = "Kim"
    }
}

然后

task demo {
    print """
            child sister is ${this.ext.parent.childSister}
            grand child brother is ${this.ext.parent.child.grandChildBrother}
            great grand child is 
            ${this.ext.parent.child.grandChild.greatGrandChild}
    """
}

祝你好运!

答案 1 :(得分:0)

我不建议在另外一个内部使用ext。这将导致gradle产生一些非常奇怪的行为。对this question的最佳回答为我们提供了创建嵌套ext变量的正确方法。

这是在gradle中制作嵌套变量的正确方法

ext {
    myarray = [
            name0     : "xx",
            name1     : "xx"
   ]
}