Gradle和Multi-Project结构

时间:2013-07-08 21:55:15

标签: android gradle android-studio build.gradle multi-project

我正在尝试了解如何处理以下项目设置:

┌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和源代码,以及部署到某个远程存储库(* default)。

另一方面,'纯Java模块'的一些模块我想有第二个议程,例如,除了默认的* build之外,我想部署一个jar特定项目的依赖关系,或类似的东西。

在构建 Actual Android Project 时,我希望模块能够在默认的* build中进行编译,最后为我的所有Android项目配置一个默认的build.gradle。很少,我不想复制该文件。

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

我想我正在寻找的是像Maven父母那样的东西,但由于我不完全理解Gradle是如何工作的,所以我打开这个给你们分享你的想法...

考虑到重复相同的构建文件(我敢说)是不可接受的,因为我可能想要在所有模块的所有构建逻辑中更改某些内容

处理这种设置的最佳方法是什么?

2 个答案:

答案 0 :(得分:57)

大部分内容与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中

dependencies {
    project(":module")
}

在/settings.gradle put

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

在/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
}

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

答案 1 :(得分:8)

如果您有与该结构匹配的文件夹,则可以将相同的构建逻辑应用于多个项目。

如果您的settings.gradle包含

include ':project2:moduleA2'

然后':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文件配置子项目,访问所有子项目或特定子项目,或使用过滤。