2015-08-08 67 views
1

我正在定义一个gradle任务“launchIPad2Simulator”,它在robovm gradle插件中对另一个已定义的任务“launchIPadSimulatorfrom”进行了子类化。目标是设置定义哪个模拟器将运行的项目属性。在子类别gradle任务中设置项目属性

// Run the IPad2 simulator 
task launchIPad2Simulator2(type: org.robovm.gradle.tasks.IPadSimulatorTask) { 

    project.setProperty("robovm.device.name", "iPad-2") 
    project.setProperty("robovm.arch", "x86") 
} 

但问题是,我必须先定义gradle.properties文件中的属性。他们甚至不需要分配任何价值。该gradle.properties文件的全部内容:

robovm.device.name 
robovm.arch 

我宁愿有gradle.properties文件空的,但如果上述任务,然后运行,则错误:错误:(112,0)没有这样的属性:显示robovm.device.name的类:org.gradle.api.internal.project.DefaultProject_Decorated

此外,如果属性只在任务中定义如下(gradle.properties为空),它们将被忽略。

// Run the IPad2 simulator 
task launchIPad2Simulator2(type: org.robovm.gradle.tasks.IPadSimulatorTask) { 

    project.properties.put("robovm.device.name", "iPad-2") 
    project.properties.put("robovm.arch", "x86") 
} 

那么什么是正确的方式来动态设置子类任务中的项目属性?

===编辑===

好了,现在我看到,设置项目属性也并不好,因为在多任务它被覆盖。所以也许这不应该是项目属性的第一位。

临时解决方案现在正在使用的任务的命令行调用:

// simulator with properties launched from command line 
task launchIPad2Simulator1(type: Exec) { 
    commandLine 'gradle', '-Probovm.device.name=iPad-2', '-Probovm.arch=x86', 'launchIPadSimulator' 
} 

回答

4

尝试

task launchIPad2Simulator2(type: org.robovm.gradle.tasks.IPadSimulatorTask) { 
    project.ext."robovm.device.name" = "iPad-2" 
    project.ext."robovm.arch" = "x86" 
} 

这是gradle这个语法的动态性质在添加到项目中的对象。

+0

谢谢。有了这个语法,我可以动态地添加项目属性。但是现在我在定义多任务时遇到了问题。假设我有launchIPad2Simulator,然后我定义了另一个launchIPadAirSimulator。在最后一个设置的属性也会覆盖运行iPad2模拟器的属性。这可能是因为它们被定义为项目属性。 – RenatoIvancic

+0

如果IPadSimulatorTask允许直接在任务上设置属性,而不是在此处使用“项目属性”,则使用起来会更容易。一种解决方法可能是将项目属性设置放在doFirst块中。这样,属性就在使用任务之前设置。这应该允许您运行org.robovm.gradle.tasks.IPadSimulatorTask的多个实例。我建议你在robovm家伙提出这个问题。 –

+0

正如你所回答的那样,IPadSimulatorTask应该允许设置任务属性。我做了一个robovm gradle项目的分支并试用了它,它按预期工作。 – RenatoIvancic