使用插件 DSL 添加 Kotlin 插件

ima*_*ke_ 5 android kotlin gradle-plugin gradle-kotlin-dsl kotlin-dsl

看起来使用插件 DSL 声明一些Kotlin 插件有两种方法:使用id()方法和kotlin()方法。例如,可以使用 或 添加 androidid("kotlin-android")插件kotlin("android")。对于 也是如此,kapt但对于 则不然parcelize。为什么不能这样呢kotlin("parcelize")?这种差异有原因吗?我尝试查找相关文档,但这并没有让我走得太远。

aSe*_*emy 12

TL;DR:获取 Parcelize 的 Gradle 插件 ID 并使用之后的所有内容org.jetbrains.kotlin.

plugins {
  kotlin("plugin.parcelize") version "1.6.10"
}
Run Code Online (Sandbox Code Playgroud)

kotlin(...)函数是 Gradle Kotlin DSL 的一部分。它是一个扩展函数,可以扩展

  1. 插件依赖规范,plugins {}
  2. DependencyHandler,dependencies {}

我将重点关注插件扩展功能。其中一些答案适用于依赖项扩展。

kotlin(...)源代码

它是生成的,所以很难看到源代码。我翻遍了 GitHub,在GenerateKotlinDependencyExtensions.kt中找到了它

fun PluginDependenciesSpec.kotlin(module: String): PluginDependencySpec =
    id("org.jetbrains.kotlin.$module")
Run Code Online (Sandbox Code Playgroud)

(已编辑,以显示最终结果)

kotlin(...)=id("org.jetbrains.kotlin.$module")

所以这没什么特别的。这是 Kotlin 特定的快捷方式id(...)。所以如果你

  1. 获取Parcelize的插件 ID ,org.jetbrains.kotlin.plugin.parcelize ,
  2. 并删除该kotlin(...)函数添加的位(org.jetbrains.kotlin. ),
  3. 你只剩下plugin.parcelize.

注意因为它位于plugins {}块中,所以它作用于 Gradle 插件 ID ( org.jetbrains.kotlin.plugin.parcelize),而不是Maven 坐标 ( org.jetbrains.kotlin:kotlin-gradle-plugin)。

plugins {
  // these two are equivalent
  // id("org.jetbrains.kotlin.plugin.parcelize")
  kotlin("plugin.parcelize")
}
Run Code Online (Sandbox Code Playgroud)

哦等等...它不起作用?

FAILURE: Build failed with an exception.
* Where:
Build file '/.../build.gradle.kts' line: 3
* What went wrong:
Plugin [id: 'org.jetbrains.kotlin.plugin.parcelize'] was not found in any of the following sources:
- Gradle Core Plugins (plugin is not in 'org.gradle' namespace)
- Plugin Repositories (plugin dependency must include a version number for this source)
Run Code Online (Sandbox Code Playgroud)

“构建因异常而失败”-插件版本

这是因为与DependencyHandler.kotlin(...)扩展不同,它PluginDependenciesSpec.kotlin(...) 不包含版本。它在错误消息中表示:“插件依赖项必须包含版本号”

因此,要解决这个问题,请添加版本号。

FAILURE: Build failed with an exception.
* Where:
Build file '/.../build.gradle.kts' line: 3
* What went wrong:
Plugin [id: 'org.jetbrains.kotlin.plugin.parcelize'] was not found in any of the following sources:
- Gradle Core Plugins (plugin is not in 'org.gradle' namespace)
- Plugin Repositories (plugin dependency must include a version number for this source)
Run Code Online (Sandbox Code Playgroud)

其他 Kotlin 插件

其他 Kotlin 插件也是如此。例如...

plugins {
  kotlin("plugin.parcelize") version "1.6.10"
}
Run Code Online (Sandbox Code Playgroud)

  • 我的天啊,多么美丽的答案啊。谢谢。 (3认同)