如何在Android模块之间共享依赖关系

时间:2015-08-05 19:30:44

标签: android android-studio gradle

我有一个Android应用程序模块(app)和一个Android库模块(库)。 app和library都包含这些相同的依赖项:

dependencies {
    compile 'com.squareup.okhttp:okhttp:2.4.0'
    compile 'com.squareup.retrofit:retrofit:1.9.0'
    compile 'io.reactivex:rxjava:1.0.13'
    compile 'io.reactivex:rxandroid:0.25.0'
}

但是,当我尝试将该块添加到项目 build.gradle时,它抱怨不知道"编译" DSL。

编辑:我要求将这个依赖项块放在PROJECT build.gradle中,以避免在每个模块的build.gradle中重复。

5 个答案:

答案 0 :(得分:37)

从Gradle Plugin版本3.0.0开始,有一种更好的方法可以做到这一点。我们可以控制每个依赖项是仅可用于当前模块,还是当前模块和依赖它的任何模块。这将使我们能够轻松地共享项目中模块之间的依赖关系。

以下是我们用于声明依赖关系的方式:

  • 编译'example.dependency:1.0.0'

以下是应该替换compile的新配置:

  • 实施'example.dependency:1.0.0' - >此依赖关系仅在此模块中使用
  • api 'example.dependency:1.0.0' - >此依赖关系也将在依赖于此模块的任何构建中可用

以下是如何使用您在问题中提到的架构来实现这一点。假设我们有一个名为'library'的模块,由'app'模块使用,我们可以使用 api 配置来声明依赖项应该与任何依赖它的模块共享。

库模块build.gradle

dependencies {

    // dependencies marked 'implementation' will only be available to the current module
    implementation 'com.squareup.okhttp:okhttp:2.4.0'

    // any dependencies marked 'api' will also be available to app module
    api 'com.squareup.retrofit:retrofit:1.9.0'
    api 'io.reactivex:rxjava:1.0.13'
    api 'io.reactivex:rxandroid:0.25.0'
}

app module build.gradle:

dependencies {

    // declare dependency on library module
    implementation project(':library')

    // only need to declare dependencies unique to app 
    implementation 'example.dependency:1.0.0'
}

有关详细信息和图表,请参阅this guide

答案 1 :(得分:6)

依赖项块(闭包)需要DependencyHandler作为委托

您需要将每个项目的DependencyHandler传递给 project gradle.build中的共享依赖项。

项目 build.gradle

dependencies {
    sharedGroup dependencies
}

app build.gradle

read ( byte[] )

REF。 https://github.com/b1uec0in/DependencyVersionResolver

(参见2.使用默认依赖关系组。 此示例解释了共享库版本的许多其他技巧,sdk版本...适用于具有许多模块的大型项目。)

答案 2 :(得分:4)

您可以执行以下操作:项目 build.gradle将指定所需的依赖项作为变量名称,然后在 app build.gradle文件中,您只需要包含变量名。当您有许多模块并且在版本号发生变化时不想编辑所有人时,这非常有用!

项目 build.gradle

dependencies {
   compile rootProject.ext.supportV4
    compile rootProject.ext.appCompat
    compile rootProject.ext.supportAnnotations
    compile rootProject.ext.recyclerView
    compile rootProject.ext.cardView
    compile rootProject.ext.palette
    compile rootProject.ext.appCompat
    compile rootProject.ext.multidex
    compile rootProject.ext.supportDesign
    compile rootProject.ext.playServicesAnalytics

}

app build.gradle文件

def saveIgnoreDups = {Class c, Map properties -> 
    c.withNewSession {
        c.newInstance(properties).save(failOnError: true)
    }
}

希望这有帮助!

答案 3 :(得分:3)

您可以在库模块中定义共享gradle依赖项,如果app模块将库作为依赖项,则您不需要指定所有内容两次。更进一步,你可以创建一个共同的'需要共享gradle依赖关系的模块,并且同时包含app&库模块需要通用模块。

答案 4 :(得分:0)

根据@SMKS的回答,我更倾向于使用此解决方案来实现传递选项功能和简单性

项目build.gradle

buildscript {
... (the rest of your repositories/dependency info here) ...
}

ext {
        googlePlayServicesVersion = '7.5.0'
        supportLibVersion = '22.2.0'
}

app build.gradle文件

dependencies {
    compile 'com.android.support:support-v4:' + supportLibVersion
    compile ' com.android.support:support-annotations:' + supportLibVersion
    compile = 'com.android.support:recyclerview-v7:' + supportLibVersion {
        transitive = true // do not know if this make sens/interest just for example
    }
   ...
}