通过 gradle 遗留插件应用程序应用 Kotlin 多平台插件
Apply Kotlin multiplatform plugin via gradle legacy plugin application
我正在对 Kotlin Multiplatform Mobile 进行一些深入的实践,我不得不使用传统的应用插件方式来应用 Gradle 插件。
我正在为 Gradle 使用 Kotlin DSL,但我没有设法包含 kotlin-multiplatform 插件。
基本上,有两种方法可以在您的项目中包含 gradle 插件:
- 通过Gradle Plugins DSL(现代方式)
- 通过 legacy plugin application(已弃用但更灵活)。
我基本上创建了一个非常空白的 gradle 项目 (gradle init
),与任何 IDE 或任何其他依赖项无关,这两者对于 KMM 项目都很常见 - 到尽可能隔离问题。
下面的build.gradle.kts工作正常,当运行通过./gradlew clean build
(通过插件DSL)
plugins {
id("org.jetbrains.kotlin.multiplatform") version "1.4.10"
}
kotlin {
jvm()
}
repositories {
jcenter()
}
但是,这个不会工作(通过遗留插件应用程序):
buildscript {
repositories {
maven {
url = uri("https://plugins.gradle.org/m2/")
}
}
dependencies {
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.10")
}
}
apply(plugin = "org.jetbrains.kotlin.multiplatform")
kotlin {
jvm()
}
repositories {
jcenter()
}
失败并出现此错误:
* What went wrong:
Script compilation errors:
Line 12: kotlin {
^ Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
public fun DependencyHandler.kotlin(module: String, version: String? = ...): Any defined in org.gradle.kotlin.dsl
public fun PluginDependenciesSpec.kotlin(module: String): PluginDependencySpec defined in org.gradle.kotlin.dsl
Line 13: jvm()
^ Unresolved reference: jvm
2 errors
它无法解析 kotlin {}
块,它本质上是 KMM 项目中的入口点。
有趣的是,在 Gradle 中使用 Groovy 而不是 Kotlin - 在这两种情况下都有效。
但我想为 Gradle 使用 Kotlin DSL 并通过传统方式应用插件,因为这样我可以动态应用插件,即在特定条件下。
一般情况下,您可以在插件 DSL 中使用 apply false
并有条件地调用 apply
。 Apply
单独 永远不会 与 Kotlin DSL 一起工作,它只与动态 Groovy 一起工作。如果您还使用插件 DSL + apply false
,Kotlin 可以像 Groovy 一样工作。
示例:
plugins {
kotlin("multiplatform") apply false // Applied conditionally later
}
有关问题的更详细讨论,请查看 this。
我正在对 Kotlin Multiplatform Mobile 进行一些深入的实践,我不得不使用传统的应用插件方式来应用 Gradle 插件。
我正在为 Gradle 使用 Kotlin DSL,但我没有设法包含 kotlin-multiplatform 插件。
基本上,有两种方法可以在您的项目中包含 gradle 插件:
- 通过Gradle Plugins DSL(现代方式)
- 通过 legacy plugin application(已弃用但更灵活)。
我基本上创建了一个非常空白的 gradle 项目 (gradle init
),与任何 IDE 或任何其他依赖项无关,这两者对于 KMM 项目都很常见 - 到尽可能隔离问题。
下面的build.gradle.kts工作正常,当运行通过./gradlew clean build
(通过插件DSL)
plugins {
id("org.jetbrains.kotlin.multiplatform") version "1.4.10"
}
kotlin {
jvm()
}
repositories {
jcenter()
}
但是,这个不会工作(通过遗留插件应用程序):
buildscript {
repositories {
maven {
url = uri("https://plugins.gradle.org/m2/")
}
}
dependencies {
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.10")
}
}
apply(plugin = "org.jetbrains.kotlin.multiplatform")
kotlin {
jvm()
}
repositories {
jcenter()
}
失败并出现此错误:
* What went wrong:
Script compilation errors:
Line 12: kotlin {
^ Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
public fun DependencyHandler.kotlin(module: String, version: String? = ...): Any defined in org.gradle.kotlin.dsl
public fun PluginDependenciesSpec.kotlin(module: String): PluginDependencySpec defined in org.gradle.kotlin.dsl
Line 13: jvm()
^ Unresolved reference: jvm
2 errors
它无法解析 kotlin {}
块,它本质上是 KMM 项目中的入口点。
有趣的是,在 Gradle 中使用 Groovy 而不是 Kotlin - 在这两种情况下都有效。
但我想为 Gradle 使用 Kotlin DSL 并通过传统方式应用插件,因为这样我可以动态应用插件,即在特定条件下。
一般情况下,您可以在插件 DSL 中使用 apply false
并有条件地调用 apply
。 Apply
单独 永远不会 与 Kotlin DSL 一起工作,它只与动态 Groovy 一起工作。如果您还使用插件 DSL + apply false
,Kotlin 可以像 Groovy 一样工作。
示例:
plugins {
kotlin("multiplatform") apply false // Applied conditionally later
}
有关问题的更详细讨论,请查看 this。