2015-04-29 73 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聲明改造現有的狀態,而不是替換它。

相關問題