概括
plugin
从块中省略版本
- 移动/指定
buildscript.dependencies
块中的版本,而不是
- 在该块中使用一个变量,该变量是一个
const
变量
简而言之,plugin
块需要字符串文字或属性,而dependency
块允许变量。最初的问题要求在“单行”中执行此操作,并且使用这种方法,您的插件块更短,并且所有模块的所有依赖项都位于一个位置。根据您的目标,这可能比“一条龙”做所有事情要好。
完整示例
对于 Android,我可以通过省略plugin
块中的版本然后const
在 buildscript 依赖项中将其指定为 a 来做到这一点。该块允许变量,而插件块只允许字符串文字。从那里开始,我使用一个对象,buildSrc
因为它提供了最大的灵活性,同时将所有模块的所有依赖项信息保存在一个文件中。所以我的设置如下所示:
├── project/
│ ├── build.gradle
| └── app/
| └── build.gradle
| └── buildSrc/
| └── build.gradle.kts
| └── src/main/java/com/example/package/Deps.kt
从那里,要在一个地方将任何插件版本指定为变量,app/build.gradle
文件会省略版本(以 kotlin 为例,但相同的方法适用于任何插件):
应用程序/build.gradle
plugins {
id 'kotlin-android' // omit version property here but provide it in buildscript dependencies
...
}
...
dependencies {
...
// Dagger
implementation Deps.Dagger.ANDROID_SUPPORT
kapt Deps.Dagger.ANDROID_PROCESSOR
kapt Deps.Dagger.COMPILER
}
然后 buildscript 依赖部分(通常在父build.gradle
文件中,但也可以在同一个文件中)提供使用变量的版本!
项目/build.gradle
import com.example.package.Deps // object in the buildSrc folder with all version info
buildscript {
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${Deps.kotlinVersion}"
}
}
最后,所有版本信息都在 buildSrc 中管理,在 Deps.kt 文件中有一个对象(有很多关于在 Android 项目中使用 buildSrc 的博客文章):
部门.kt
object Deps {
// For use in the top-level buildscript dependency section which only works with a constant rather than `Deps.Kotlin.version`
const val kotlinVersion = "1.3.72"
object Kotlin : Version(kotlinVersion) {
val STDLIB = "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$version"
}
object Dagger : Version("2.25.2") {
val ANDROID_SUPPORT = "com.google.dagger:dagger-android-support:$version"
val ANDROID_PROCESSOR = "com.google.dagger:dagger-android-processor:$version"
val COMPILER = "com.google.dagger:dagger-compiler:$version"
}
}
open class Version(@JvmField val version: String)
总的来说,我真的很喜欢这个设置。它很灵活,所有依赖信息都在一个地方,甚至跨多个模块,最重要的是,它允许在输入依赖项时在 gradle 文件中完成代码!