1

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

4

1 回答 1

4

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

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

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

  1. PluginDependenciesSpec,plugins {}
  2. DependencyHandler,dependencies {}

我将专注于插件扩展功能。其中一些答案适用于 Dependency 扩展。

kotlin(...)源代码

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

fun PluginDependenciesSpec.kotlin(module: String): PluginDependencySpec =
    id("org.jetbrains.kotlin.$module")

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

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")
}

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

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(...) 不包括 version。它在错误消息中说:“插件依赖项必须包含版本号”

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

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

其他 Kotlin 插件

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

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"
}
于 2022-02-22T15:58:22.843 回答