2016-01-01 5 views
1

Я совершенно новый для градации, и мне нравится эта система сборки для ее выразительной силы. Однако некоторые вещи выглядят довольно сложно.Конфигурация проекта DRY в 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 в качестве параметра из предыдущий пример)

ответ

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 Run, чтобы проверить, работает ли он правильно. Полная демо-версия: here. Не стесняйтесь спрашивать в случае возникновения каких-либо вопросов.

+1

Это работает, thx! – user3231055

Смежные вопросы