【问题标题】:Android Gradle include module dependencies in another moduleAndroid Gradle 在另一个模块中包含模块依赖项
【发布时间】:2018-03-13 13:51:59
【问题描述】:

我正在使用最新的 Android Studio 3.0.0-beta6 来构建我的 Android 项目,并且存在这个依赖问题。 Gradle 鼓励我将所有 compile's 替换为 implementation's。这是我的项目结构:

项目:

  • 模块1

    • 模块2

Module1 依赖于一些库,module2 依赖于 module1。但是,module1 中的库在 module2 中不可见。我不想复制粘贴依赖项,而宁愿只声明一次库依赖项。有一个简单的解决方案吗?谢谢。

module1 的构建等级:

dependencies {
    ....
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
    ...
}

module2 的构建等级:

implementation project(':module1')

【问题讨论】:

  • 所以为了更好地理解你对模块 1 和 2 有一些常见的依赖关系对吗?
  • 是的。 1 和 2 有共同的依赖关系。
  • 这很简单!!只需将您的公共依赖项放在根项目 -> build.gradle 中,它们将适用于您的所有模块
  • 但我不想在我的所有模块中都使用它,只需要这 2 个。
  • 检查我的更新答案

标签: android dependencies android-gradle-plugin


【解决方案1】:

在你的根项目 -> build.gradle 你应该有类似的东西:

allprojects {
    repositories {
        jcenter()
    }
}

在那里添加依赖!!

更新

如果您不希望所有模块都具有公共依赖项,而只希望特定模块,请执行以下操作:

  1. 在您的根项目/gradleScript 中创建一个文件夹
  2. 在此文件夹中创建一个 .gradle 文件(例如 gradleScript/dependencies.gradle) 看起来像:

    ext {
    
    //Version
    
    supportLibrary = '22.2.1'
    
    //Support Libraries dependencies
    supportDependencies = [
            design           :         "com.android.support:design:${supportLibrary}",
            recyclerView     :         "com.android.support:recyclerview-v7:${supportLibrary}",
            cardView         :         "com.android.support:cardview-v7:${supportLibrary}",
            appCompat        :         "com.android.support:appcompat-v7:${supportLibrary}",
            supportAnnotation:         "com.android.support:support-annotations:${supportLibrary}",
    ]
    }
    
  3. 在你的根项目 build.gradle 添加这一行:

    buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
    }
    }
    
    // Load dependencies
    apply from: 'gradleScript/dependencies.gradle'
    
  4. 在你的模块中相应地添加:

    // Module build file
    
    dependencies {
        //......
        compile supportDependencies.appCompat
        compile supportDependencies.design
    }
    

希望对你有帮助!!!

【讨论】:

  • 这样一个不错的解决方案。我们可以在apply from 部分使用环境变量吗?喜欢apply from: '%projects_root%/gradleScript/dependencies.gradle'
  • gradleScript 文件夹直接在您的项目目录中。应用程序模块文件夹在哪里。如果你想阻止其他人看到它,那么我建议将它添加到 .gitignore 中。但是如果你真的想要环境变量,你可以试试这个:例如:println System.getenv('JAVA_HOME')
  • 这种方法不显示升级版本警告miro.medium.com/max/3708/1*hgOycRk5Rds-gOS80Hz6IA.png
【解决方案2】:

老问题,但在我看来,您所追求的只是在您的 gradle 文件中使用 api 而不是 implementation

如果一个模块 X 声明了一个 api 依赖项,它对任何其他依赖于 X 的模块都是可传递的。如果它声明了一个 implementation 依赖项,那么来自该依赖项的类将放在模块 X 的类路径中,但不适用于依赖于模块 X 的任何模块。

来自 Gradle 的documentation

出现在 api 配置中的依赖项将传递给库的使用者,因此将出现在使用者的编译类路径中。另一方面,在实现配置中找到的依赖项不会暴露给消费者,因此不会泄漏到消费者的编译类路径中。

具体来说:

模块 1:

dependencies {
    ....
    api 'io.reactivex.rxjava2:rxandroid:2.0.1'
    api 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
    ...
}

模块 2:

implementation project(':module1')

这难道不是您想要做的最简单的解决方案吗?

【讨论】:

  • 如果 api 由于某种原因不是一个选项怎么办
  • 如果可以的话,另一个答案,但这应该是公认的答案。点赞!
猜你喜欢
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-05
相关资源
最近更新 更多