Gradle:我可以编译依赖于自己输出的代码吗?

时间:2013-09-24 18:47:15

标签: java compiler-construction gradle

这是一个奇怪的问题,但这不是理论上的......

  1. 我想制作一个Gradle项目,该项目使用buildSrc内部的java项目。该java项目定义了构建过程中使用的一些类。

  2. 令人讨厌的伎俩是,Gradle项目会产生一堆输出,包括属于buildSrc本身的Java项目的已修改类。

    < / LI>

    有没有办法用Gradle表达这个?

    我现在想到的唯一解决方案是:连续两次运行整个构建脚本。有什么办法可以避免吗?例如,通过生成buildSrc的修改代码,重新编译buildSrc,然后生成主Gradle项目的其他输出?

2 个答案:

答案 0 :(得分:2)

好的,基于Michael Easter的精彩示例,我可以在其自己的任务之一上调用主要级别的构建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. Codegen(在buildSrc
  2. 中创建新的java类
  3. 重新编译buildSrc
  4. 使用重新编译的buidSrc
  5. 中的帮助程序生成文档

答案 1 :(得分: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机制自动调用'build'任务。目标是从根调用'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

这表明:

  • 编译buildSrc中的Java项目
  • 调用根'build1'(在此编译主项目)
  • buildSrc'compile2'被称为

classpath和codegen很讨厌但可能很直接。