Подтвердить что ты не робот

Gradle и многопроектная структура

Я пытаюсь понять, как мне подойти к следующей настройке проекта:

┌Top Android Project
│
├── Project 1 - (Pure Java Modules)
│    │
│    ├── Module A1
│    ├── Module B1
│    :
│    └── Module Z1
│  
├── Project 2 - (Android Libraries Modules)
│    │
│    ├── Module A2
│    ├── Module B2
│    :
│    └── Module Z2
│  
└── Module - Actual Android Project

В текущей установке у меня есть build.gradle в каждом из модулей, что я действительно ненавижу об этой настройке, так это то, что весь контент build.gradle дублируется между модулями.

Факт в том, что в большинстве из них мне нужна одна и та же логика: " Чистые Java-модули" - это все модули infra, которые я хотел бы использовать для вывода JavaDoc и источников, а также развертывание в какой-либо удаленный репозиторий (* по умолчанию).

С другой стороны, некоторые модули " Чистых Java-модулей" Я хотел бы, например, иметь второй план, помимо встроенной по умолчанию * сборки, я хотел бы развернуть банку с зависимостей для конкретного проекта или что-то в этом роде.

При создании Фактического проекта Android я хотел бы, чтобы модули компилировались в сборке по умолчанию * и, наконец, настраивали по умолчанию build.gradle для всех моих проектов Android, которые довольно несколько, и я не хотел бы дублировать этот файл.

============================================ ===================

Я предполагаю, что я ищу что-то вроде родительского pom Maven, но поскольку я не совсем понимаю, как работает Gradle, я открываю это вам, ребята, чтобы поделиться своими мыслями...

Принимая во внимание, что дублирование одного и того же файла сборки (я полагаю) неприемлемо, из-за того, что я могу что-то изменить во всей логике сборки всех модулей

Каким будет лучший подход для обработки такого рода настроек?

4b9b3361

Ответ 1

В большинстве случаев это нормально для страницы http://www.gradle.org/docs/current/userguide/multi_project_builds.html. Однако вам нужно будет добавить

evaluationDependsOn(':project1')
evaluationDependsOn(':project2')

чтобы gradle оценивал project1 и project2 перед модулем. Во всех проектах, содержащих код, вам понадобится пустой файл build.gradle. Это также позволит вам при необходимости настроить проект.

Пример: https://github.com/ethankhall/AndroidComplexBuild

Добавьте build.gradle в корень ваших проектов. Таким образом, вам нужно 4, в которых есть полезная информация.

/build.gradle
/settings.gradle
/project1/build.gradle
/project2/build.gradle
/module/build.gradle

в/build.gradle put

dependencies {
    project(":module")
}

в/settings.gradle положить

include ':module'
include ':project1', ':project1:A1', ':project1:B1', ':project1:Z1'
include ':project2', ':project2:A2', ':project2:B2', ':project2:Z2'

в/project1/build.gradle положить

apply plugin: 'java'

subprojects {
    apply plugin: 'java'

    sourceCompatibility = JavaVersion.VERSION_1_6
    targetCompatibility = JavaVersion.VERSION_1_6

    repositories{
        mavenCentral()
    }   

    //Anything else you would need here that would be shared across all subprojects
}

/project2/build.gradle

buildscript {
    repositories {
        mavenCentral()
    }   

    dependencies {
        classpath 'com.android.tools.build:gradle:0.4.2'
    }   
}

subprojects {
    apply plugin: 'android-library'

    android {
        compileSdkVersion 17
        buildToolsVersion "17.0"
    }   

    sourceCompatibility = JavaVersion.VERSION_1_6
    targetCompatibility = JavaVersion.VERSION_1_6

    repositories{
        mavenCentral()
    }   

    //Anything else you would need here that would be shared across all subprojects
}

в/module/build.gradle put

buildscript {
    repositories {
        mavenCentral()
    }   

    dependencies {
        classpath 'com.android.tools.build:gradle:0.4.2'
    }   
}

evaluationDependsOn(':project1')
evaluationDependsOn(':project2')

apply plugin: 'android'

android {
    compileSdkVersion 17
    buildToolsVersion "17.0"
}

dependencies {
    compile project(":project1:A1")
    compile project(":project1:B1")
    compile project(":project1:Z1")

    compile project(":project2:A2")
    compile project(":project2:B2")
    compile project(":project2:Z2")
}

Ответ 2

Если у вас есть папки, соответствующие этой структуре, вы можете применить одну и ту же логику сборки к нескольким проектам.

Если ваши настройки .gradle содержат

include ':project2:moduleA2'

then ': project2' также является проектом, и он может иметь свой собственный build.gradle, в котором вы можете написать:

subprojects { project ->
    apply plugin 'android-library'

    // more configuration
}

Если вы не применяете какой-либо плагин к самому "project2", то этот проект просто ничего не выведет (что, вероятно, вы хотите), но таким образом вы можете легко настроить весь его подпроект.

Тогда вы также можете использовать весь свой подмодуль, чтобы определить определенную для них логику

Вы также можете технически сделать это в project2/build.gradle, если хотите сохранить все в одном файле. Вы можете прочитать http://www.gradle.org/docs/current/userguide/multi_project_builds.html, чтобы узнать, как настроить подпроекты из родительского файла build.gradle, обращаясь ко всем подпроектам или к конкретным, или используя фильтрацию.