Gradle中的干式项目配置

Gradle中的干式项目配置,gradle,Gradle,我对gradle很陌生,我喜欢这个构建系统的表现力。然而,有些事情看起来相当棘手 考虑配置代码: project(":A") { apply plugin: "X" apply plugin: "Y" someVar = "aa" dependencies { compile project(":C1") compile project(":C2") compile project(":C3") } }

我对gradle很陌生,我喜欢这个构建系统的表现力。然而,有些事情看起来相当棘手

考虑配置代码:

project(":A") {
    apply plugin: "X"
    apply plugin: "Y"

    someVar = "aa"

    dependencies {
        compile project(":C1")
        compile project(":C2")
        compile project(":C3")
    }
}

project(":B") {
    apply plugin: "X"
    apply plugin: "Z"

    someVar = "bb"

    dependencies {
        compile project(":C1")
        compile project(":C2")
    }
}
我想使这个配置尽可能干燥。我天真地想做的是:

void myProjectType(someVarValue){
    apply plugin: "X"

    someVar = someVarValue

    dependencies {
        compile project(":C1")
        compile project(":C2")
    }
}

project(":A") {
    myProjectType("aa");

    apply plugin: "Y"

    dependencies {
        compile project(":C3")
    }
}

project(":B") {
    myProjectType("bb");

    apply plugin: "X"
}
对我来说很好,但在格拉德尔不起作用。有什么建议吗,如何正确地做


如果找到了一半问题的解决方案,如下所示:

project(":A"){
...
apply from: "${rootProject.projectDir}/gradle-config/config.gradle"
...
}

但是,这种方法不允许“应用”部分的显式参数化(上一示例中的参数为someVarValue)

您需要将
项目的实例传递给该方法,否则gradle将不知道配置了什么。因此,它将是:

subprojects {
  apply plugin: 'java'
}

project(':A') {
    apply plugin: 'war'

    common(project, 'aa')

    dependencies {
        compile project(':C3')
    }
}

project(':B') {
    apply plugin: 'groovy'
    common(project, 'bb')
}

def common(p, value) {
  p.with {

    ext.someVar = value

    dependencies {
        compile project(':C1')
        compile project(':C2')
    }
  }
}

['A', 'B'].each { n ->
  configure(project(":$n")) { p ->
    task printVar << {
      println "project -> $p.name, var -> $someVar"
    }
    task printDeps << {
      p.configurations.compile.each { d ->
        println "project -> $p.name, dependency -> $d"
      }
    }
  }
}
子项目{
应用插件:“java”
}
项目(“:A”){
应用插件:“战争”
普通(项目“aa”)
依赖关系{
编译项目(“:C3”)
}
}
项目(':B'){
应用插件:“groovy”
通用(项目“bb”)
}
def公用(p,值){
p、 与{
ext.someVar=value
依赖关系{
编译项目(“:C1”)
编译项目(“:C2”)
}
}
}
['A','B'].每个{n->
配置(项目(“:$n”){p->
任务printVar