使用插件 DSL 添加 Kotlin 插件

Adding Kotlin plugins using plugins DSL

看起来有两种使用插件 DSL 声明 一些 Kotlin 插件的方法:使用 id() 方法和 kotlin() 方法。例如,可以使用 id("kotlin-android")kotlin("android"). This is also the case for kapt but not for parcelize 添加 android 插件。为什么不能是 kotlin("parcelize")?这种差异是有原因的吗?我试图查找相关文档,但这并没有让我走得太远。

TL;DR:获取 Parcelize 的 Gradle 插件 ID 并使用 org.jetbrains.kotlin.

之后的所有内容
plugins {
  kotlin("plugin.parcelize") version "1.6.10"
}

kotlin(...) 函数是 Gradle Kotlin DSL 的一部分。是extends

的扩展函数
  1. PluginDependenciesSpec,plugins {}
  2. DependencyHandler,dependencies {}

我将重点介绍插件扩展功能。此答案的部分内容适用于依赖扩展。

kotlin(...)源代码

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

中找到了它
fun PluginDependenciesSpec.kotlin(module: String): PluginDependencySpec =
    id("org.jetbrains.kotlin.$module")

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

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

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

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

NOTE Because this is in the plugins {} block, it's working on the Gradle plugin ID (org.jetbrains.kotlin.plugin.parcelize), not the Maven coordinates (org.jetbrains.kotlin:kotlin-gradle-plugin).

plugins {
  // these two are equivalent
  // id("org.jetbrains.kotlin.plugin.parcelize")
  kotlin("plugin.parcelize")
}

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

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)

“构建失败并出现异常”- 插件版本

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

所以要解决它,添加一个版本号。

plugins {
  kotlin("plugin.parcelize") version "1.6.10"
}

其他 Kotlin 插件

the other Kotlin plugins也是如此。例如...

plugins {

  // https://kotlinlang.org/docs/all-open-plugin.html
  kotlin("plugin.allopen") version "1.6.10"

  // https://kotlinlang.org/docs/all-open-plugin.html#spring-support
  kotlin("plugin.spring") version "1.6.10"

  // https://kotlinlang.org/docs/no-arg-plugin.html
  kotlin("plugin.noarg") version "1.6.10"

  // I can't find a Gradle Plugin ID for 
  // https://kotlinlang.org/docs/sam-with-receiver-plugin.html
  // so this won't work!
  // kotlin("kotlin-sam-with-receiver") version "1.6.10"
}