我相信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很討厭,但可能很簡單。
難道你不能擺脫循環依賴?將Groovy項目分爲代碼生成模塊和消耗代碼生成器輸出的部分。 (和/或可能有一些共享代碼。)然後運行代碼生成器,編譯生成的Java,編譯你的主要內容。 – millimoose
我的第一本能也是。不幸的是,我正在對付一個遺留項目,代碼生成實際上使用它輸出的類。 (這個過程是手工引導回來的。) – Bosh
好的,但循環依賴幾乎意味着你不能在一個步驟中做到這一點。 (從技術上講,沒有兩個是正確的,正確的方法是重新運行代碼生成器,直到沒有任何改變。) – millimoose