Примените конфигурацию к конкретным проектам в gradle build script

У меня есть проект gradle, в котором есть приложения Java, а также приложения для Android.

root/
  build.gradle
  settings.gradle
  java1/
  java2/ 
  android1/
  android2/
  java3/

и т.д..

Какова наилучшая практика для структурирования моей сборки script? Я полный новичок gradle, и я переношу проект с maven на gradle.

Я хотел что-то сделать вместо

configure(subprojects) {}

применять плагины и другие конкретные вещи.

таких как

configure(java1, java2, java3) { // java specifics }
configure(android1, android2) { // android specifics }

Я, вероятно, приближаюсь к этому неправильно.

Более явным образом мне нужно применить плагин java только для проектов java и плагина android для проектов Android.

Ответ 1

Существует несколько способов, в зависимости от того, что вы хотите... Несколько примеров:

// Configures just project java1
project(":java1") { ... }

// Configures projects java1 and java2
["java1","java2"].each { name ->
  project(":$name") { ... }
}

Вы можете использовать обычный groovy для поиска/повторения всех проектов.

Ответ 3

Другая опция:

configure([ project(':sub1'), project(':sub2'), ... ]) {
    ...
}

Ответ 4

Самый короткий и простой вариант:

configure(subprojects.findAll()) {
   if (it.name.equals('MY_PROJECT')) {
     ...
   } else {
     ...
   }
}

Ответ 5

Другой подход...

В настройках .gradle вы определяете свои проекты следующим образом:

gradle.ext.javaProjects=[]
gradle.ext.androidProjects=[]

javaProject('java1')
javaProject('java2')
javaProject('java3')
androidProject('android1')
androidProject('android2')

def javaProject(String name) {
    gradle.ext.javaProjects.add(name)
    include ":$name"
}

def androidProject(String name) {
    gradle.ext.androidProjects.add(name)
    include ":$name"
}

Теперь вы можете ссылаться на те, которые находятся в вашем корневом файле build.gradle:

def javaProjects = subprojects.findAll {gradle.ext.javaProjects.contains(it.name)};
def androidProjects = subprojects.findAll {gradle.ext.javaProjects.contains(it.name)};

configure(javaProjects) {
...
}
configure(androidProjects) {
...
}

Может быть, это overkill... но у меня обычно есть метод определения проекта в моих настройках. В любом случае. Например. если вы хотите поместить все java-проекты в папку java, вы можете определить такие вещи:

def javaProject(String name) {
    gradle.ext.javaProjects.add(name)
    include ":$name"
    project(":$name").projectDir = file('java/'+ name)
}