提问者:小点点

通过gradle遗留插件应用程序应用Kotlin多平台插件


我正在使用Kotlin Multiplatform Mobile进行深入的实践,我被迫使用Gradle插件和传统的插件应用方式。

我正在为Gradle使用静态编程语言DSL,我没有设法包含kotlin多平台插件。

本质上,有两种方法可以在您的项目中包含 gradle 插件:

  1. 通过Gradle Plugins DSL(现代方式)
  2. 通过传统插件应用程序(已弃用,但更灵活)

我基本上创建了一个非常空白的gradle项目(<code>gradle init</code>),与任何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项目的切入点。

有趣的是,使用 Groovy 而不是 Kotlin for Gradle - 在这两种情况下都有效。

但是我想为Gradle使用静态编程语言DSL并通过传统方式应用插件,因为这样我就可以动态应用插件,即在某些条件下。


共1个答案

匿名用户

通常,您可以在插件 DSL 中使用 apply false,并有条件地调用 apply。单独应用永远不会与 Kotlin DSL 一起使用,它仅适用于动态 Groovy。Kotlin 可以像 Groovy 一样工作,如果你也使用 DSL 在其中应用的插件 false。例:

plugins {
    kotlin("multiplatform") apply false // Applied conditionally later
}

有关问题的更详细讨论,请检查此项。