【问题标题】:Gradle multi-module dependecy issueGradle 多模块依赖问题
【发布时间】:2014-11-28 18:50:25
【问题描述】:

信息

所以我的项目结构是这样的:

项目根目录:
|资源模块(使用包名:com.derk.application.resources)
-+ 源代码
---+ 主要
-----+ 资源
|核心模块(使用包名:com.derk.application)
-+ 源代码
---+ 主要
-----+ 源代码
|品牌模块(使用客户域的任何包名)

Resources-module 包含 res 文件。
Core 包含一个 git 模块,其中包含我们不断更新的代码库的代码。
Brand 包含 build.gradle,我在其中设置了客户的包名并将 main/res 目录绑定到资源模块 main/res,然后将 main/src 绑定到 core-module main/src 文件夹。

像这样:

    android.sourceSets.main {
        manifest.srcFile "src/main/AndroidManifest.xml"
        res.srcDirs = ["$rootDir/resources-module/src/main/res"]
        java.srcDirs = ["$rootDir/core-module/src/main/java", "src/main/java"]
    }
}

我不希望在任何情况下更改核心模块源而不将其推送到主存储库,这意味着我只对使用核心模块的所有项目进行全局更改/修复。这就是我尝试这种结构的原因。

核心模块中的源文件将加载导入
导入 com.derk.application.resources.R;
导入 com.derk.application.resources.BuildConfig;

从 gradle/idea 处理资源生成的内容

由于 Brand-module 是由于 packagename 更改,我必须使用某种包含 R 和 BuildConfig 的中间模块以便于部署,以便 core-sources 确实永远不会进行本地修改。

当我尝试为品牌模块刷新 gradle 时,我没有遇到任何问题,当我检查时,android studio 似乎在 com.derk.application.resources 中找到 R.java 和 BuildConfig.java 就好了在 Android Studio 中去掉链接

但是

当我尝试运行 Brand-module 时,我得到:

"Execution failed for task ':core-module:compileReleaseJava'."

它现在显示给我:

 Error:(20, 39) error: package com.derk.application.resources does not exist

还以为我加了

 dependencies {
    compile project(':resources-module')
 }

到 core-module 的 build.gradle。

所以问题是:

如何设置 gradle 来处理这种跨模块依赖?

请记住,我不希望为我设置的每个新项目更改核心模块导入的包名,因为我们会对用于多个项目的 gitmodule 进行本地更改。

/.ps

目前我可以毫无问题地运行模块资源模块并运行应用程序,并使用我为其选择的静态包名。但这也是问题所在,我想让它保持静态,因此我引入了第三个模块。

【问题讨论】:

    标签: android gradle android-studio


    【解决方案1】:

    你这样做是错误的。您想要实现的是实现一个普通的库模块(您为每个客户使用)。然后您可以从使用共享模块的类型应用程序创建一个新模块。在这种情况下,您不需要弄乱共享模块的路径。

    如果您的共享模块位于项目根目录之外的另一个目录中,您可以使用此 settings.gradle:

    include ':CustomerX', ':SharedModule'
    project(':SharedModule').projectDir = new File('../../some/where/else')
    

    如果不是,你可以省略最后一行。

    当您保留旧的目录结构时,您应该尝试使用此 build.gradle:

    apply plugin: 'com.android.library'
    
    android {
        compileSdkVersion 9
        buildToolsVersion '21.0.1'
    
        defaultConfig {
            minSdkVersion 9
            targetSdkVersion 21
        }
    
        sourceSets {
            main {
                assets.srcDirs       = ['assets']
                res.srcDirs          = ['res']
                aidl.srcDirs         = ['src']
                resources.srcDirs    = ['src']
                renderscript.srcDirs = ['src']
                java.srcDirs         = ['src']
                manifest.srcFile 'AndroidManifest.xml'
            }
        }
    }
    
    dependencies {
        // just as example
        compile 'com.android.support:support-v4:21.0.2'
    }
    

    您的客户 build.gradle 应该看起来像像这样:

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 21
        buildToolsVersion '21.0.1'
    
        defaultConfig {
            minSdkVersion 9
            targetSdkVersion 21
    
        signingConfigs {
            release {
                storeFile file("your.keystore")
                storePassword 'pwd1'
                keyAlias "alias"
                keyPassword 'pwd2'
            }
        }
    
        buildTypes {
            debug {
                debuggable true
                minifyEnabled false
                shrinkResources false
            }
            release {
                debuggable false
                jniDebuggable false
                signingConfig signingConfigs.release
                minifyEnabled true
                shrinkResources true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    
    dependencies {
        // dependencies of the main project
        compile 'com.android.support:support-v4:21.0.0'
        compile 'com.android.support:appcompat-v7:21.0.0'
        compile project(':SharedModule')
    }
    

    【讨论】:

    • 这本质上就是资源模块正在做的事情。然而,核心模块由 Activites 和 Fragment 类组成,它们也被认为是共享的,因此在这个意义上它不仅仅是一堆库代码。
    • 当您对模块执行此操作时,清单中发布的活动也将与目标项目合并。
    • 上面的建议似乎并没有涵盖我所追求的。核心正在使用预期始终位于同一根目录中的外部资源。我想创建一个可以拥有 git-module 的项目,该项目具有所有源代码的基础,以及另一个不属于存储所有资源的 git-module 的目录。这通常不是问题,但是当您不希望更改每个项目的资源的导入路径时,它就会成为问题。问题是包含资源的包不在brand-module的buildDirectory中
    • 我正在为此使用子模块,这样也可以。但是我不确定你真正想做什么。
    • 我希望上面的大文本能够解释这一点:) 你的 git-submodules 实际上是一个项目吗?因为这里就是这种情况,我们试图让一个项目在任何地方都有相同的代码,只是一个外部资源目录,我们可以快速换出我们想要的设计。我还没有发现,您可以在哪里共享代码库而不对其进行本地修改。
    猜你喜欢
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 2021-04-06
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多