我已经研究了数千个关于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:TEST
。 println
看到正确的值,但是传递给已执行main方法的参数是Generator/build.gradle
中配置的参数,而不是projectB/build.gradle
中配置的参数。正如答复中指出的那样,可以使用惰性属性评估来解决此问题,但这不能解决第二个问题。projectB
和projectC
,生成器也只能运行一次。我需要分别为Generator:run
和projectB
中的每个运行projectC
(以为每个从属项目生成不同的源)。 我该如何使用它?我认为需要一个完全不同的策略。我不必使用命令行并运行;我也可以尝试更直接地运行生成器的主类并向其传递参数,但是我确实发现运行任务非常方便(复杂的类路径是自动设置的,等等)。生成器本身就是Java / Scala项目,可以在同一多项目版本中进行编译。
答案 0 :(得分:2)
注意:任务与Java中的方法不同。每次gradle调用,任务将执行0或1次。一个任务永远不会在一次Gradle调用中执行两次(或多次执行)
我认为您需要两项或多项任务。例如:
task run1(type:xxx) {
args 'foo'
}
task run2(type:xxx) {
args 'bar'
}
然后,您可以在其他项目中依赖run1或run2。