5

我正在使用 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
     ....
4

1 回答 1

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')
}
于 2013-10-24T03:22:28.993 回答