多项目Gradle构建中的代码生成器任务

时间:2018-11-27 17:26:31

标签: gradle

我已经研究了数千个关于SO的类似问题,但我仍然迷失了方向。我有一个简单的多项目构建:

rootProject.name = 'mwe'
include ":Generator"
include ":projectB"
include ":projectC"

顶级build.gradle如下(settings.gradle):

plugins { id "java" } 
allprojects { repositories { jcenter() } }

并带有两种项目的build.gradle文件。第一个(Generator)公开了一个运行命令,该运行命令使用命令行参数来运行生成器:

plugins { 
  id "application" 
  id "scala"
}

dependencies { compile "org.scala-lang:scala-library:2.12.3" }
mainClassName = "Main"
ext { cmdlineargs = "" }
run { args cmdlineargs }

代码生成器将从projectB(以及类似的projectC,以及许多其他对象)中调用。我正在尝试这样做(projectB / build.gradle):

task TEST {
  project (":Generator").ext.cmdlineargs = "Hurray!"
  println ("Value set:" + project(":Generator").ext.cmdlineargs )
  dependsOn (":Generator:run")
}

无论我尝试做什么(这里是gradle新手),我都无法获得所需的东西。我有两个问题:

  • 在运行任务cmdlineargs时未设置属性:projectB:TESTprintln看到正确的值,但是传递给已执行main方法的参数是Generator/build.gradle中配置的参数,而不是projectB/build.gradle中配置的参数。正如答复中指出的那样,可以使用惰性属性评估来解决此问题,但这不能解决第二个问题。
  • 即使我同时构建projectBprojectC,生成器也只能运行一次。我需要分别为Generator:runprojectB中的每个运行projectC(以为每个从属项目生成不同的源)。

我该如何使用它?我认为需要一个完全不同的策略。我不必使用命令行并运行;我也可以尝试更直接地运行生成器的主类并向其传递参数,但是我确实发现运行任务非常方便(复杂的类路径是自动设置的,等等)。生成器本身就是Java / Scala项目,可以在同一多项目版本中进行编译。

1 个答案:

答案 0 :(得分:2)

注意:任务与Java中的方法不同。每次gradle调用,任务将执行0或1次。一个任务永远不会在一次Gradle调用中执行两次(或多次执行)

我认为您需要两项或多项任务。例如:

task run1(type:xxx) {
    args 'foo'
}
task run2(type:xxx) {
    args 'bar'
} 

然后,您可以在其他项目中依赖run1或run2。

相关问题