2013-02-13 112 views
0

我使用Gradle作为我的项目的构建系统。 我想要的是如果给定的属性设置为“true”,则使任务A依赖于任务B.这是可行的,如果答案是肯定的,我该怎么做?Gradle - 我可以使用约定属性来管理任务依赖关系吗?

目前,我使用的是conventionMapping,但这似乎不起作用。我的代码如下所示:

MyTask.conventionMapping.propertyName = { MyPluginConvention.propertyName } 

if (MyTask.propertyName.equals("true")) { 
    MyTask.dependsOn ... 
} 

由于提前, 马林

+0

一些更多的信息将有所帮助。这是来自构建脚本还是插件类的代码? MyTask和MyPluginConvention是类名还是变量名?谁宣布任务A,谁宣布任务B?等。 – 2013-02-13 16:04:16

+0

这段代码来自一个插件类。 MyTask和MyPluginConvention是类名。 MyTask扩展了DefaultTask并实现了VerificationTask。这两个类都是由我声明的。我想依赖的任务也由我声明,它也扩展了DefaultTask并实现了VerificationTask。 – mdzh 2013-02-14 08:09:02

回答

1

而是与任务/会展类工作的,你必须与他们实例工作。此外,您将不得不推迟是否添加任务依赖关系的决定。例如:

def myTask = project.tasks.create("myTask", MyTask) 
def otherTask = ... 
def myConvention = new MyConvention()  
... 
myTask.conventionMapping.propertyName = { myConvention.propertyName } 
// defer decision whether to depend on 'otherTask' 
myTask.dependsOn { myTask.propertyName == "true" ? otherTask : [] } 

如果有在范围上没有任务的变量,你也可以通过project.myTaskproject.tasks["myTask"]参考现有任务。

PS:公约对象大部分被extension objects取代。

+0

嗯..这正是我正在做的。此方法不起作用,因为在插件配置的这一点上,该属性尚未设置。 Gradle懒惰地评估约定属性。我必须找到一种方法来“强制”评估。我怎样才能做到这一点? – mdzh 2013-02-14 14:50:40

+0

你说过“MyTask和MyPluginConvention是类名”。因此'MyTask.conventionMapping'等是错误的。也就是说,除非您使用骆驼大小写变量名称,这是非常不鼓励的,并且对于Groovy而言,甚至可能会破坏您的代码。我已经更新了我的答案以涵盖其他问题。 – 2013-02-14 15:22:52

+0

对不起,你是对的。我的第一篇文章有​​点混乱。 myTask和myPluginConvention是用户定义的类的实例。无论如何...我想通了,我可以使用project.afterEvaluate方法,它现在都在工作。不管怎么说,还是要谢谢你。 – mdzh 2013-02-14 17:58:11