繁体   English   中英

Gradle多模块依赖问题

[英]Gradle multi-module dependecy issue

信息

所以我有这个项目结构,如下所示:

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

资源模块包含res文件。
Core包含一个git模块,其中包含我们不断更新的代码库的代码。
品牌包含build.gradle,在其中我设置客户的软件包名称,并将main / res目录绑定到资源模块main / res,然后将main / src绑定到核心模块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是由于更改了程序包名称而导致的,因此我必须使用某种包含R和BuildConfig的中间模块来简化部署,因此核心源实际上永远都不会进行本地修改。

当我尝试刷新brand-module的gradle时,我没有任何问题,当我检查链接时,android studio似乎在com.derk.application.resources中很好地找到了R.java和BuildConfig.java。在Android Studio中

然而

当我尝试运行品牌模块时,我得到:

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

现在它向我显示:

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

甚至以为我添加了

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

到核心模块的build.gradle。

所以问题是:

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

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

/.ps

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

您以错误的方式进行操作。 您要实现的目标是实现一个普通的库模块(每个客户都使用该模块)。 然后,您可以从使用共享模块的类型应用程序中创建一个新模块。 在这种情况下,您无需弄乱共享模块的路径。

如果您的共享模块位于项目根目录以外的其他目录中,则可以使用以下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')
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM