我正在使用Gradle创建一个多项目构建文件。许多子项目需要通过传入某些参数来执行存在于另一个子项目中的任务。如何在Gradle中实现这一目标?
例如:
root project
- project B : task X
- project A : task Y (param m, param n)
我需要projectB.taskX来调用projectA.taskY(m,n)
更新
子项目A的任务类型为JavaExec,需要输入参数到属性文件的位置
task generateCode(dependsOn:['classes','build'], type: JavaExec) {
main = 'jjrom.ObjectGen'
classpath = sourceSets.main.runtimeClasspath
args 'arg1', 'arg2', file(propertiesFilePath).path
}
现在,有10个子项目,所有子项目都需要使用包含属性文件位置的参数调用此任务'generateCode'。此外,应该在构建每个子项目之前执行此任务,这可以使用dependsOn实现。
我的java项目代码组织:
trunk/
projA/src/java/../ObjectGen.java
projB/src/java/../properties.xml
projC/src/java/../properties.xml
projD/src/java/../properties.xml
....
答案 0 :(得分:3)
任务无法调用其他任务。相反,解决此问题的方法是向所有十个子项目添加generateCode
任务。您可以使用类似于以下代码的根构建脚本执行此操作:
subprojects {
apply plugin: 'java'
configurations {
codegen
}
dependencies {
// A contains the code for the code generator
codegen project(':A')
}
task generateCode(type: JavaExec) {
main = 'jjrom.ObjectGen'
classpath = configurations.codegen
args 'arg1', 'arg2'
}
compileJava.dependsOn(generateCode)
}
如果没有关于属性文件所在位置的一般模式,可以在子项目的构建脚本中添加此信息:
generateCode {
args file('relative/path/to/properties/file')
}