为什么必须在 Android 中明确指定 $kotlin_version?

Leo*_*Aso 5 android gradle kotlin

在 Android Studio 项目中支持 Kotlin 需要两个依赖项:kotlin-gradle-plugininProject/build.gradlekotlin-stdlib-jdk7in Project/app/build.gradle,并且这两个需要具有相同的版本。常见的方法似乎是使用单个kotlin_version变量,然后您必须在 IDE 更新其 Kotlin 插件时手动更改该变量——从 Android Studio 3.1.3 开始,如果您使用 a$variable作为版本。

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
Run Code Online (Sandbox Code Playgroud)

在非 Android Kotlin 项目中,即那些使用apply: 'kotlin'代替 的项目apply plugin: 'kotlin-android',可以简单地从依赖项中省略版本kotlin-stdlib-jdk7,然后会从插件中自动解析。

implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7'
Run Code Online (Sandbox Code Playgroud)

这甚至适用于 Android 项目中的非 Android 模块。我的问题是,为什么这在 Android 模块中是不可能的?为什么不能$kotlin_version简单地省略?如果该功能自 Kotlin 1.1.2 以来就存在,为什么即使在 Kotlin 1.2.51 上它仍然会导致 Android 上的编译错误?或者实际上是否有可能做到这一点,如果有,如何做到?

Ale*_*ger 0

事实上,这不是 Kotlin 特有的,而是与 Gradle 管理依赖关系的方式有关。

请参阅https://docs.gradle.org/current/userguide/declaring_dependency.html了解如何在 Gradle 中指定依赖项的版本。

在这种情况下

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
Run Code Online (Sandbox Code Playgroud)

是设置版本的标准方法。由于此版本号对于多个依赖项是相同的,因此在变量中声明,以便轻松更改所有 Kotlin 库的版本。

implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7'
Run Code Online (Sandbox Code Playgroud)

dependency constraints自 Gradle 4.6 起可用的用途。它用于相同的目的。人们可以将库的版本设置在一个中心位置,这样就可以将版本保持为通用值,而无需遍历gradle.properties较大项目的所有文件。