2013-04-06 39 views
2

我正在嘗試最近在Gradle 1.5中發佈的新Sonar Runner任務。我想要做的是能夠使聲納運動員任務依賴於另一項任務,以便我可以正確設置該項目的聲納屬性(即sonar.sources,sonar.binaries,sonar.libraries,sonar.java.source ,sonar.java.target)。使聲納轉輪Gradle任務取決於我的任務之一

具體來說,我使用了一個名爲bnd的osgi構建工具,它將在執行ant init任務時提供這些值(注意,雖然我包含默認的bnd build.xml文件,但我的完整構建實際上是使用gradle完成的) 。

我想我能夠通過這樣來定製聲納亞軍任務(這是一個多模塊構建):

subprojects { 
    sonarRunner.dependsOn init 
} 

最後加入這樣的事情(從我瞭解的BND螞蟻變量):

subprojects { 
    sonarRunner { 
     sonarProperties { 
      property "sonar.java.source", ant.property["project.sourcepath"] 
      property "sonar.java.target", ant.property["project.output"] 
      property "sonar.sources", ant.property["project.allsourcepath"] 
      property "sonar.libraries", ant.property["project.buildpath"] 
     } 
    } 

    sonarRunner.dependsOn init 
} 

不幸的是,當我嘗試添加dependsOn我得到的錯誤:

* What went wrong: 
A problem occurred evaluating root project 'myproject'. 
> Could not find property 'init' on project ':com.company.myproject.mymodule'. 

如果我試圖讓sonarRunner取決於gradle這個任務,我得到以下錯誤:

* What went wrong: 
A problem occurred evaluating root project 'myproject'. 
> Could not find method dependsOn() for arguments [task ':gradletask'] on [email protected]0c. 

我失去的東西在這裏很明顯?如果有人能指引我正確的方向,這將是一個很大的幫助。

+0

在Gradle端聲明源目錄等可能會更好。在這種情況下,「sonar-runner」插件將自動使用正確的值。請注意,Gradle還通過它的'osgi'插件支持'bnd'。 – 2013-04-08 07:35:35

+0

使用單獨的文件來指定依賴關係,無論是常春藤,maven還是bnd文件(我在bnd文件中指定我的依賴關係,這使我可以在Eclipse中使用bndtools),ide集成更容易。我認爲gradle osgi插件類似於bnd maven插件 - 它只使用bnd的清單創建功能。 – Gareth 2013-04-11 22:52:31

回答

5

根項目gradle文件在子項目gradle文件之前進行評估,這意味着init嘗試解決它的位置上不存在。

,如果你想在根項目申報依賴一種解決方法是在http://www.gradle.org/docs/current/userguide/build_lifecycle.html描述使用afterEvaluate,嘗試:

subprojects { 
    afterEvaluate{ 
     sonarRunner.dependsOn init 
    } 
} 

另一種解決方案是添加依賴於子項目,直接或通過應用另一個根gradle文件。

apply from: '../sonardependency.gradle' 
+0

當你解決了我的問題的第一部分(爲什麼找不到init)時,我標記了你。謝謝!然而它沒有解決第二部分(「找不到方法for dependsOn()」)。 – Gareth 2013-04-07 00:54:41

+0

你回答了我的具體問題,所以我會給你。 – Gareth 2013-04-11 23:10:48

10

您與不能夠調用dependsOn()sonarRunner任務問題來自該插件定義了兩種sonarRunner擴展和sonarRunner任務的事實。當在Gradle構建文件中按名稱解析對象時,它看起來像擴展優先於任務,因此您的堆棧跟蹤指出您試圖在org.gradle.api.sonar.runner.SonarRunnerExtension_Decorated實例上調用dependsOn(),而不是在SonarRunner任務實例上調用它。

我認爲,如果你從任務容器檢索任務明確你應該確定:

tasks.sonarRunner.dependsOn init 
+0

對於更好或更壞的情況,插件提供擴展名和具有相同名稱的任務是一種常見模式。其他示例是IDE和代碼質量插件。 – 2013-04-08 07:32:18

+0

感謝您的信息!顯然。但它並沒有解決我的問題。如果我在我的子項目塊中添加這個,我會在任務集中找到「找不到屬性'sonarRunner'」。當我在頂層項目上運行它時,它找到了任務,但沒有做到我需要的東西(我真的希望它在爲子項目設置聲納屬性之前在子項目中運行特定的初始化任務)。 – Gareth 2013-04-11 23:05:07

+0

聽起來像你正在嘗試添加任務依賴項,然後再應用'sonar-runner'插件。通常在任務執行時改變配置爲時已晚,但由於'sonarRunner'塊是懶惰評估的(按照文檔),它可能適用於這種特殊情況。 – 2013-04-12 07:12:47

1

如果有人有興趣,這是獲得BND信息的一種方式是在聲納正確設置每個子項目(我確信有更好的方法):

subprojects { 
    afterEvaluate { 
     sonarRunner { 
      sonarProperties { 
       ant.taskdef(resource:"aQute/bnd/ant/taskdef.properties", 
        classpath: "../cnf/plugins/biz.aQute.bnd/biz.aQute.bnd-2.0.0.jar"); 
       def projectDir = project.rootDir.toString() + "/" + project.name; 
       ant.bndprepare(basedir:projectDir,print:"false",top:null); 

       def binaries = ant.properties['project.buildpath'].split(':') as ArrayList; 
       binaries.remove(0); 
       def binariesString = binaries.join(','); 
       properties["sonar.java.source"] = ant.properties['javac.source']; 
       properties["sonar.java.target"] = ant.properties['javac.target']; 
       properties["sonar.binaries"] = ant.properties['project.output'].replace(':',','); 
       properties["sonar.sources"] = ant.properties['project.sourcepath'].replace(':',','); 
       properties["sonar.libraries"] = binariesString; 
      } 
     } 
    } 
} 
+2

您可以刪除'afterEvaluate',因爲無論如何都要評估sonarRunner塊(按照文檔)。 – 2013-04-12 07:08:43