2013-06-30 74 views
0

我已將Checkstyle檢查添加到我的Gradle實體中。 配置是:Gradle:自定義任務只執行一次

checkstyle { 
    configFile = new File("${project.projectDir}/config/checkstyle/sun_checks.xml") 
    showViolations = false 
} 

checkstyleMain { 
    doLast{ 
     println("checkstyle main") 
     project.ext.checkType = "main" 
     tasks.checkstyleReport.execute() 
    } 
} 


checkstyleTest { 
    doLast{ 
     println("checkstyle test") 
     project.ext.checkType = "test" 
     tasks.checkstyleReport.execute() 
    } 
} 

task checkstyleReport{ 
    checkstyleReport.outputs.upToDateWhen { false } 
} 

checkstyleReport << { 
    logger.info("Producing checkstyle html report") 
    final source = "${project.projectDir}/build/reports/checkstyle/${project.checkType}.xml" 
    final xsl = "${project.projectDir}/config/checkstyle/checkstyle-simple.xsl" 
    final output = "$buildDir/reports/checkstyle/${project.checkType}.html" 
    println(source) 
    println(xsl) 
    println(output) 
    ant.xslt(in: source, 
      style: xsl, 
      out: output 
    ) 
} 

當我調用:

gradle --daemon clean checkstyleMain checktyleTest 

輸出是:

... 
:clean 
:compileJava 
:processResources 
:classes 
:checkstyleMain 
checkstyle main 
/<root_path_here>/build/reports/checkstyle/main.xml 
/<root_path_here>/config/checkstyle/checkstyle-simple.xsl 
/<root_path_here>/build/reports/checkstyle/main.html 
:compileTestJava 
:processTestResources 
:testClasses 
:checkstyleTest 
checkstyle test 

正如你看到的,checkstyleReport任務被調用了兩次,但產生的輸出只有一次。我甚至試過outputs.upToDateWhen { false }但它不起作用。

非常感謝您的幫助。

回答

2

Gradle任務最多隻能執行一次。此外,顯式調用任務不受支持,並會導致各種問題。正確的方法是爲每個Checkstyle任務聲明一個報告任務(例如使用任務配置規則),並使其依賴於該Checkstyle任務(或使用mustRunAfter)。

+0

謝謝。但如果其中一項任務失敗呢?如何在任何情況下執行取決於失敗任務的自定義任務? – StKiller

+0

現在你可以設置'checkstyle.ignoreFailures = true'。 Gradle 1.7(或1.8)將爲此問題引入一個通用解決方案(*終結器任務*)。 –