Gradle中的DRY项目配置

时间:2016-01-01 14:54:13

标签: gradle

我对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"
}

对我来说很好看,但它并没有在gradle中工作。有什么建议,怎么做正确的方法?

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

project(":A"){
...
apply from: "${rootProject.projectDir}/gradle-config/config.gradle"
...
}
然而,这种方法并不允许对应用的'进行显式参数化。 part(someVarValue作为前一个例子的参数)

1 个答案:

答案 0 :(得分:1)

您需要将project的实例传递给方法 - 否则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"
      }
    }
  }
}

运行gradle printDeps printVar以验证其是否正常工作。完整演示是here。如有任何问题,请随时询问。