看起来有两种方法可以使用插件 DSL 声明一些Kotlin 插件:使用id()
方法和kotlin()
方法。例如,可以使用id("kotlin-android")
或来添加 android 插件kotlin("android")
。这也是这种情况,kapt
但不是parcelize
。为什么不能这样kotlin("parcelize")
?这种差异有原因吗?我试图查找相关文档,但这并没有让我走得太远。
1 回答
TL;DR:为 Parcelize 获取 Gradle 插件 ID 并在之后使用所有内容org.jetbrains.kotlin.
plugins {
kotlin("plugin.parcelize") version "1.6.10"
}
该kotlin(...)
函数是 Gradle Kotlin DSL 的一部分。它是一个扩展函数
- PluginDependenciesSpec,
plugins {}
块 - 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(...)
. 所以如果你
- 获取Parcelize的插件 ID ,
org.jetbrains.kotlin.plugin.parcelize
, - 并删除
kotlin(...)
函数添加的位 (org.jetbrains.kotlin.
), - 你只剩下
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"
}