2013-09-24 97 views
4

這是一個奇怪的問題,但它不是理論......Gradle:我可以編譯依賴於它自己的輸出的代碼嗎?

  1. 我想提出一個使用buildSrc裏面Java項目中的搖籃項目。該java項目定義了構建過程中使用的一些類。

  2. 討厭的訣竅是,該項目的搖籃產生了一堆的輸出,包括屬於buildSrc本身的Java項目修改類。

有什麼辦法可以用Gradle來表達這個嗎?

我現在唯一想到的解決方案是:連續運行整個構建腳本兩次。有什麼辦法可以避免這種情況?例如,通過生成buildSrc的修改代碼,重新編譯buildSrc,然後生成主Gradle項目的附加輸出?

+2

難道你不能擺脫循環依賴?將Groovy項目分爲代碼生成模塊和消耗代碼生成器輸出的部分。 (和/或可能有一些共享代碼。)然後運行代碼生成器,編譯生成的Java,編譯你的主要內容。 – millimoose

+0

我的第一本能也是。不幸的是,我正在對付一個遺留項目,代碼生成實際上使用它輸出的類。 (這個過程是手工引導回來的。) – Bosh

+0

好的,但循環依賴幾乎意味着你不能在一個步驟中做到這一點。 (從技術上講,沒有兩個是正確的,正確的方法是重新運行代碼生成器,直到沒有任何改變。) – millimoose

回答

1

我相信the Gradle doc的59.4節可以幫到你。

使用Gradle 1.8,我試圖「從構建中運行另一個Gradle構建」,其中的另一個Gradle構建是buildSrc。

這不涉及codegen,但可能足以提供幫助。

要複製,我在buildSrc一個簡單的Java項目,具有的build.gradle看起來像這樣:

apply plugin: 'java' 

build << { 
    println "TRACER: hello from buildSrc java build" 
} 

task compile2() << { 
    println "TRACER: hello from buildSrc compile2" 
} 

的「建設」的任務是通過buildSrc機制自動調用。目標是從根調用'compile2'。在根,中的build.gradle看起來是這樣的:

task build1() << { 
    println "TRACER: top-level build1" 
} 

task build2(type: GradleBuild) { 
    buildFile = 'buildSrc/build.gradle' 
    tasks = ['compile2'] 
} 

build2.dependsOn build1 

在根級別,輸出如下:

$ gradle build2 

:buildSrc:compileJava etc etc 
TRACER: hello from buildSrc java build 
TRACER: top-level build1 
TRACER: hello from buildSrc compile2 

這表明:

  • Java項目在buildSrc編譯
  • 調用root'build1'(在這裏編譯你的主項目)
  • buil調用dSrc'compile2'

classpath和codegen很討厭,但可能很簡單。

+0

這本身非常有幫助,我非常欣賞具體的例子。但是如果我理解正確,在主構建腳本調用'buildSrc'的'compile2'之後,主構建腳本將不會有新編譯的'buildSrc'類可用於執行。 (也就是說,無法從新的'buildSrc'中交換新類)。是對的嗎? – Bosh

2

好吧,建立在邁克爾復活節真棒例如,我可以有主級構建調用GradleBuild對自己的任務之一:

task generateNewCode() << { 
    println("tracer top build") 

    // BuildTool is a Java class defined in `buildSrc` 
    // ... and it has a cyclic dependency on its own 
    // output (eek -- but that's what I'm dealing with!) 
    BuildTool.generateNewCode(); 
} 

task generateDocs(type: GradleBuild) { 
    buildFile='build.gradle' 
    tasks = ['generateDocs_Real'] 
} 

task generateDocs_Real << { 
    BuildTool.outputDocumentation(); 
} 

generateDocs.dependsOn generateNewCode 

然後我可以調用gradle generateDocs做:

  1. 代碼生成(在buildSrc
  2. 創建新的Java類重新編譯buildSrc
  3. 使用重新編譯的幫助程序生成文檔buidSrc
相關問題