编辑:我在考虑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
答案 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.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]
}
}