2015-04-29 48 views
3

我想为几个测试任务设置一些东西。更具体地说,我想添加一些环境变量和一些系统属性,也许还有一些其他的东西,例如“dependencies”或“workingDir”。与常规Test的任务,我能做到这一点,如何扩展新任务类型的Gradle任务的行为?

task test1(type:Test, dependsOn:[testPrep,testPrep1]){ 
    workingDir testWorkingPath 
    systemProperty 'property','abs' 
    environment.find { it.key ==~ /(?i)PATH/ }.value += (System.properties['path.separator'] + myLibPath) 
    environment.LD_LIBRARY_PATH = "/usr/lib64:/lib64:${myLibPath}:" + environment.LD_LIBRARY_PATH 
} 

task test2(type:Test, dependsOn:[testPrep]){ 
    workingDir testWorkingPath 
    systemProperty 'property','abs' 
    environment.find { it.key ==~ /(?i)PATH/ }.value += (System.properties['path.separator'] + myLibPath) 
    environment.LD_LIBRARY_PATH = "/usr/lib64:/lib64:${myLibPath}:" + environment.LD_LIBRARY_PATH 
    systemPropety 'newProperty','fdsjfkd' 
} 

这将是不错的延长定期测试任务类型,其中常见的定义是定义一个新的任务类型MyTestType

task test1(type:MyTestType){ 
    dependsOn testPrep1 
} 

task test2(type:MyTestType){ 
    systemPropety 'newProperty','fdsjfkd' 
} 

什么是最好的方法来做到这一点?看来​​方法是最终的,不能扩展。我需要做一些类似doFirst的设置来设置这些属性。我应该在构造函数中添加所有额外的值吗?有没有其他的钩子可以使用?谢谢。

回答

3

一般来说,你可以扩展“测试”任务,并实现您的自定义

task test1(type:MyTestType){ 
} 

task test2(type:MyTestType){ 
    systemProperty 'newProperty','fdsjfkd' 
} 

class MyTestType extends Test { 
    public MyTestType(){ 
     systemProperty 'property','abs' 
    } 
} 

另外,您可以配置Test类型的所有任务,用更少的样板:

// will apply to all tasks of type test. 
// regardless the task was created before this snippet or after 
tasks.withType(Test) { 
    systemProperty 'newProperty','fdsjfkd' 
} 
+0

非常感谢。我更喜欢第二个。看起来,第一种方法违反了“不要在构造函数中调用可重写方法”的经常引用的原则,尽管它可能并不重要,因为'systemProperty'方法非常安全。另外,如果我需要项目中的任何属性,所有上下文都不再可用,并且我必须始终调用getProject()。 – zggame

0

它也有可能指定特定超类设置的行为。例如说,你要集中在environment.find块,但允许设置myLibPath每个任务是这样的:

task test1(type: MyTestType) { 
} 
task test2(type: MyTestType) { 
    libPath = '/foo/bar' 
} 

你可以做到这一点通过重写configure方法:

class MyTestType { 
    @Input def String libPath 

    @Override 
    public Task configure(Closure configureClosure) { 
    return super.configure(configureClosure >> { 
     environment.find { it.key ==~ /(?i)PATH/ }.value += (System.properties['path.separator'] + (libPath ?: myLibPath)) 
    }) 
    } 
} 

这里我们使用closure composition操作>>将传入的闭包与我们的重写行为组合在一起。用户指定的configureClosure将首先运行,可能会设置libPath属性,然后我们在此之后运行environment.find块。这也可以用在构造函数中软违约结合,如在Rene Groeschke's answer

请注意,如果您配置的任务不止一个这样的特定用例可能打破,因为environment.find声明改造现有的状态,而不是替换它。

相关问题