62

我试图了解我应该如何处理以下项目设置:

┌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 模块”都是基础模块,我希望将输出、JavaDoc 和源代码打包,并部署到某个远程存储库(* 默认)。

另一方面,“纯 Java 模块”的一些模块我想有第二个议程,例如,除了默认*构建之外,我想为特定项目部署一个具有依赖项的 jar,或者类似的东西.

在构建实际的 Android 项目时,我希望模块在默认*构建中编译,最后为我的所有 Android 项目配置一个默认的 build.gradle,这些项目很多,我不想复制它文件。

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

我想我正在寻找类似 Maven 父 pom 的东西,但由于我不完全了解 Gradle 的工作原理,所以我向你们开放这个以分享你的想法......

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

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

4

2 回答 2

60

其中大部分对于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 放

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 放

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")
}
于 2013-07-09T00:33:23.410 回答
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 文件配置子项目,访问所有子项目或特定子项目,或使用过滤。

于 2013-07-08T23:38:57.310 回答