我有一个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中重复。
答案 0 :(得分:37)
从Gradle Plugin版本3.0.0开始,有一种更好的方法可以做到这一点。我们可以控制每个依赖项是仅可用于当前模块,还是当前模块和依赖它的任何模块。这将使我们能够轻松地共享项目中模块之间的依赖关系。
以下是我们用于声明依赖关系的方式:
以下是应该替换compile的新配置:
以下是如何使用您在问题中提到的架构来实现这一点。假设我们有一个名为'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
}
...
}