如何在使用 GradleBuild 任务的插件中正确使用 gradle 扩展名?
How to use gradle extension correctly in plugins using GradleBuild task?
编辑 :考虑到 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
}
然后我得到 "uninitialised" 而不是 "myTarget"。
如何在此处获取 myext.target 的值?
我正在使用 gradle 2.3
试试这个:
定义一个名为 "myext" 的实例变量,类型为 "MyExt"。
在 "apply" 方法中,执行此操作:
myext = project.extensions.create('myext',MyExt)
在"getTarget"方法中,return"myext.target"。
我已经成功地使用 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]
}
}
编辑 :考虑到 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
}
然后我得到 "uninitialised" 而不是 "myTarget"。
如何在此处获取 myext.target 的值?
我正在使用 gradle 2.3
试试这个:
定义一个名为 "myext" 的实例变量,类型为 "MyExt"。
在 "apply" 方法中,执行此操作:
myext = project.extensions.create('myext',MyExt)
在"getTarget"方法中,return"myext.target"。
我已经成功地使用 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]
}
}