Градирня и Многопроектная конструкция


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

┌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

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

дело в том, что я хотел бы такую же логику в большинстве из них,' Чистые Модули Java ' все инфракрасные модули, которые я хотел бы Jar выход, JavaDoc, и источники и развертывание в каком-либо удаленном репозитории (* по умолчанию).

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

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

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

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

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

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

2 55

2 ответа:

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

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

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

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

добавить сборку.gradle в корне ваших проектов. Поэтому вам нужно 4, которые имеют полезную информацию в нем.

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

in / build.gradle put

dependencies {
    project(":module")
}

in / settings.gradle put

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

in / project1 / build.gradle put

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
}

in / 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")
}

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

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

include ':project2:moduleA2'

тогда ': project2 ' также является проектом, и он может иметь свою собственную сборку.gradle, в котором можно написать:

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

    // more configuration
}

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

тогда вы также можете иметь все ваши подмодули поставить некоторую логику, которая специфична для них

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