4

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

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

  2. 讨厌的技巧是,Gradle 项目产生了一堆输出,包括 属于自己的 Java 项目的修改buildSrc类。

有什么方法可以用 Gradle 来表达这一点吗?

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

4

2 回答 2

2

好的,以 Michael Easter 的精彩示例为基础,我可以让主级构建调用 aGradleBuild对其自己的任务之一:

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. 重新编译buildSrc
  3. 使用重新编译的帮助程序生成文档buidSrc
于 2013-09-25T16:50:59.383 回答
1

我相信Gradle 文档的第 59.4 节可以帮助你。

使用 Gradle 1.8,我尝试“从一个构建运行另一个 Gradle 构建”,其中另一个 Gradle 构建是 buildSrc。

这不涉及代码生成,但可能足以提供帮助。

为了复制,我在 buildSrc 中有一个简单的 Java 项目,其 build.gradle 如下所示:

apply plugin: 'java'

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

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

'build' 任务通过 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

这表明:

  • buildSrc 中的 Java 项目被编译
  • 调用根“build1”(在此处编译您的主项目)
  • 调用 buildSrc 'compile2'

类路径和代码生成很讨厌,但可能很简单。

于 2013-09-25T03:13:14.603 回答