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

Posted

技术标签:

【中文标题】通过 gradle legacy 插件应用程序应用 Kotlin 多平台插件【英文标题】:Apply Kotlin multiplatform plugin via gradle legacy plugin application 【发布时间】:2021-02-17 09:54:49 【问题描述】:

我正在对 Kotlin Multiplatform Mobile 进行一些深入的实践操作,我不得不使用传统的插件应用方式来应用 Gradle 插件。

我正在使用 Kotlin DSL for Gradle,但我没有设法包含 kotlin-multiplatform 插件。

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

    通过Gradle Plugins DSL(现代方式) 通过legacy plugin application(已弃用但更灵活)。

我基本上创建了一个非常空白的 gradle 项目 (gradle init),与任何 IDE 或任何其他依赖项无关,这两者对于 KMM 项目都很常见 - 以尽可能隔离问题。

当通过./gradlew clean build(通过插件 DSL)运行时,下面的 build.gradle.kts 工作正常

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 - 适用于两种情况。

但我想使用 Kotlin DSL for Gradle 并通过传统方式应用插件,因为这样我可以动态应用插件,即在某些条件下。

【问题讨论】:

有支持kotlin的gradle插件的最低版本吗? 我什至不知道这存在,但也许你需要应用 kotlin dsl 插件? plugins.gradle.org/plugin/org.gradle.kotlin.kotlin-dsl 【参考方案1】:

一般情况下,您可以在插件 DSL 中使用apply false,并有条件地调用applyApply 单独永远不会与 Kotlin DSL 一起使用,它只与动态 Groovy 一起使用。如果您还使用插件 DSL + apply false,Kotlin 可以像 Groovy 一样工作。 示例:

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

有关问题的更详细讨论请查看this。

【讨论】:

是的。那是我最初启动线程的人。谢谢你把这个带到这里,我忘了做。

以上是关于通过 gradle legacy 插件应用程序应用 Kotlin 多平台插件的主要内容,如果未能解决你的问题,请参考以下文章

Gradle构建Java Web应用:Servlet依赖与Tomcat插件(转)

Gradle 插件

spring boot gradle 插件、应用程序插件和 gradle 2.3 包装器

应用 gradle 插件有啥区别

如何将插件应用于gradle中的一种风格?

Gradle应用程序插件:运行CLI应用程序而不使用Gradle输出和延迟