Примените конфигурацию к конкретным проектам в 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 для поиска/повторения всех проектов.
Ответ 2
configure(subprojects.findAll {it.name == "java1" && it.name == "java2"}) {
Под разделом фильтрации в руководстве
Надеюсь, это поможет кому-то еще.
Ответ 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)
}