2013-03-11 106 views
17

我挺好的gradle這個配置,即內置一切就好了。但是我的多項目構建項目中的其中一個很大程度上來自其他項目,我很樂意將它移到另一個git repo並配置子模塊來處理它。搖籃多重賦予「項目找不到屬性「sourceSets」錯誤

首先,我搬到項目及其資源到子文件夾Libraries/MovedProject。改變gradle配置中的一些行後,它工作正常。但是後來我決定爲這個項目編寫一個新的build.gradle,並將所有的配置從主要的配置中移出。

而這正是一切停止工作。當我嘗試調用任何任務時,它總是以Could not find property 'sourceSets' on project ':Libraries/MovedProject'結束 。行負責,它是:

dependencies { 
    ... 
    if (noEclipseTask) { 
     testCompile project(':Libraries/MovedLibrary').sourceSets.test.output 
    } 
} 

,我使用的運行中,我使用類其他項目的測試。如果我刪除該行,那麼構建只有在達到使用MovedProject的項目的compileTestJava任務時纔會失敗。如果我刪除了這一行,並呼籲gradle :Libraries/MovedLibrary:properties我可以看到:

... 
sourceCompatibility: 1.7 
sourceSets: [source set main, source set test] 
standardOutputCapture: [email protected] 
... 

gradle :Libraries/MovedLibrary:build建立正確。

目前我擁有了一切設置如下:

  1. 目錄:

    • /SomeMainProject1
    • /SomeMainProject2
    • /SomeMainProject3
    • /庫
      • /MovedProject
        • 的build.gradle
        • dependencies.gradle
        • project.gradle
        • tasks.gradle
    • /生成器
      • dependencies.gradle
      • 項目。格林
      • tasks.gradle
    • 的build.gradle
    • settings.gradle
  2. 設置。gradle這個

    include Libraries/MovedProject, 
         SomeMainProject1, 
         SomeMainProject2, 
         SomeMainProject3 
    
  3. sourceSets爲MovedProject在Libraries/MovedProject/project.gradle定義:

    sourceSets { 
        main { 
         java { 
          srcDir 'src' 
          srcDir 'resources' 
         } 
         resources { srcDir 'resources' } 
        } 
        test { java { 
         srcDir 'test/unit' 
        } } 
    } 
    
  4. 的依賴,使得使用sourceSets.test.output都存儲在Builder/dependancies.gradle,併爲需要MovedProject運行每個項目設定測試:

    project(':SomeMainProject1') { 
        dependencies { 
         ... 
    
         if (noEclipseTask) { 
          testCompile project(':Libraries/net.jsdpu').sourceSets.test.output 
         } 
        } 
    } 
    

什麼是最簡單的方法來擺脫該錯誤,並使用當前目錄結構進行gradle構建項目?我想明白爲什麼Gradle不能看到這個屬性。

回答

14

該問題的線路有問題,因爲它假定項目:Libraries/MovedLibrary評估(未執行)在當前項目之前,可能不是這種情況。如果不是,那麼另一個項目的源代碼集就不會被配置。 (甚至沒有sourceSets屬性,因爲java-base插件尚未應用。)

通常,最好不要涉及其他項目的項目模型,特別是如果它們不是其子項目的子項目當前的項目。在項目A使用項目B的測試代碼的情況下,推薦的解決方案是讓項目B暴露測試Jar(通過artifacts {}塊),然後由項目A消耗。

如果您想保留它們是,您可能可以通過使用gradle.projectsEvaluated {}project.evaluationDependsOn()解決此問題。有關更多信息,請參閱Gradle Build Language Reference

+0

非常感謝!現在一切都在建立。使用'project.evaluationDependsOn()'屬性。我想這個解決方案很骯髒,但我必須堅持一段時間。 – 2013-03-12 18:25:55