【问题标题】:Gradle and Multi-Project structureGradle 和多项目结构
【发布时间】:2013-07-06 09:02:13
【问题描述】:

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

┌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 和源代码打包,并且部署到某个远程存储库(* 默认)。

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案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 中放置

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

    【讨论】:

    • 您可以将您的buildscript部分代码移动到您的顶级 build.gradle 文件中,以解决一些重复问题 :)
    • @arcone 真的吗?我不知道它会将其应用于所有后续项目。我将不得不玩这个。谢谢!
    • @Ethan:干得好。深思熟虑且内容丰富的答案。
    • 伊桑?你只是用完整的 github repo 回答了那个问题吗?赞一个!
    【解决方案2】:

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

    如果你的 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 文件配置子项目,访问所有子项目或特定子项目,或使用过滤。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 2017-02-11
      • 1970-01-01
      • 2014-02-03
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多