2012-10-01 65 views
4

背景:我有一個多項目Gradle構建,並且我定義了一個Gradle任務,它在Exec任務中運行JavaScript單元測試。此任務的輸入是項目中的JavaScript文件,因此只有修改了其中一個源文件時纔會重新運行。該任務將添加到來自主項目的所有JavaScript項目中。使用來自項目依賴關係的輸入定義Gradle任務?

問:我要擴展這個,這樣的測試重新運行項目中的JavaScript文件,或任何其項目依賴的改變。這最好的做法是什麼?

下面的代碼如果放置在每個子項目構建文件中(在依賴聲明之後),但是我們有20多個JavaScript子項目,我想保持DRY。

project.ext.jsSourceFiles = fileTree("src/").include("**/*.js*") 

task testJavaScript(type: Exec, dependsOn: configurations.js) { 
    inputs.files resolveJavascriptDependenciesFor(project) 
    outputs.file "report.xml" 

    // Run tests in JSTestDriver using command line call...  
} 

def resolveJavascriptDependenciesFor(project) { 
    def files = project.jsSourceFiles 
    project.configurations.js.allDependencies.each { 
     files = files + resolveJavascriptDependenciesFor(it.dependencyProject) 
    } 
    return files 
} 

有沒有更好的解決方案?也許我不必自己解決所有文件依賴關係?

+0

測試文件夾已經被排除爲簡單起見,示例源。 –

回答

2

正如前面的答案中所寫,在子項目閉包中添加jsTest任務可以很容易地爲每個子項目添加jstesting支持。我想你可以通過聲明的源文件作爲依賴緩解你的輸入設置:

dependencies { 
    js filetree("src/main").include("**/*.js") 
} 

subprojects { subproj -> 
    task testJavaScript(type: Exec, dependsOn: configurations.js) { 
     inputs.files subproj.configurations.js 
     outputs.file "report.xml" 

     commandLine ... 
    }  
} 
+0

對不起,爲簡單起見,我僅省略了示例中的輸出。問題似乎是在定義輸入時未指定依賴關係。 –

+0

順便說一句,指定subproj.configurations.js作爲輸入會有什麼不同?是否可以通過某種方式指定源,以便包含來自子項目依賴關係的文件?我嘗試過,但沒有看到任何區別,因爲我沒有定義任何將JavaScript源文件綁定到js配置的東西。 –

+0

任務的輸入在執行任務之前的執行階段被評估。因此我認爲所有的依賴關係都是在評估時間定義的。 你可以做這樣的事情,當地的js文件添加到您的JS配置: 依賴{ \t JS文件樹( 「SRC /主」)匹配{it.endsWith( 「JS」)} 。} –

0

是否有可能做到這樣的事情?

allprojects {project -> 
    task testJavaScript(type: Exec, dependsOn: configurations.js) { 
     inputs.files resolveJavascriptDependenciesFor(project) 
    // Run tests in JSTestDriver using command line call...  
    } 
} 

def resolveJavascriptDependenciesFor(project) { 
    def files = project.jsSourceFiles 
    project.configurations.js.allDependencies.each { 
     files = files + resolveJavascriptDependenciesFor(it.dependencyProject) 
    } 
    return files 
} 

該方法的任務是在所有的項目,將被稱爲遞歸。 不完全確定這是行得通的,但我認爲它的路要走

+0

如果從主項目運行目標,這可能會重新運行所有測試,但如果依賴項中的文件發生更改,則它不會對重新運行進行任何更改。 –

+0

inputs屬性應該包含可以改變任務輸出的東西。如果依賴可以觸發重新運行,那麼它們也應該處於輸入狀態。輸入和輸出屬性正好用於增量構建 – mathiasbn

0

我發現工作,但不是很大,使用相同的依賴性規範作爲一種解決方案在問題中。它是在主項目中以稍微不同的順序加載gradle文件。

萬事達build.gradle

subprojects { 
    configurations { 
     js 
    } 

    // Apply the subproject's build.gradle, but with another name (that isn't automatically loaded) 
    if (project.file('depends.gradle').exists()) { 
     apply from: project.file('depends.gradle') 
    } 

    apply from: project.parent.file('javaScriptProjectTasks.gradle') 
} 

比較到以前,非工作主build.gradle

subprojects { 
    configurations { 
     js 
    } 

    apply from: project.parent.file('javaScriptProjectTasks.gradle') 
    // The subproject's build.gradle is automatically loaded 
} 
相關問題