【问题标题】:How to apply -Xopt-in=kotlin.ExperimentalUnsignedTypes to all subprojects?如何将 -Xopt-in=kotlin.ExperimentalUnsignedTypes 应用于所有子项目?
【发布时间】:2021-08-19 17:16:46
【问题描述】:

我的项目包含多个使用 kotlin-multiplatform 插件或 kotlin-js 插件的子项目,我想在所有子项目中使用实验性无符号类型.

到目前为止,我已经尝试过这个,它不起作用:

subprojects {
    tasks.withType<KotlinCompile>().all {
        kotlinOptions.freeCompilerArgs += "-Xopt-in=kotlin.ExperimentalUnsignedTypes"
    }

    extensions.findByType<KotlinMultiplatformExtension>()?.sourceSets {
        all {
            languageSettings.useExperimentalAnnotation("kotlin.ExperimentalUnsignedTypes")
        }
    }
}

有没有办法将 kotlin 编译器 arg -Xopt-in=kotlin.ExperimentalUnsignedTypes 添加到 Gradle 中的所有子项目中?

【问题讨论】:

    标签: kotlin gradle kotlin-multiplatform kotlin-js


    【解决方案1】:

    我已经通过反复试验达到了这一点,所以我不确定这是正确的方法。

    我有一个包含一些多平台、JVM 和 JS 子项目的多项目构建,我想启用 kotlin.RequiresOptIn 注释。所以我最终为各种 kotlin 编译任务设置了这个编译器参数:

    subprojects {
        val compilerArgs = listOf("-Xopt-in=kotlin.RequiresOptIn")
        tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
            kotlinOptions.jvmTarget = "1.8"
            kotlinOptions.freeCompilerArgs += compilerArgs
        }
    
        tasks.withType<org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile> {
            kotlinOptions.freeCompilerArgs = compilerArgs
        }
    
        tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompileCommon> {
            kotlinOptions.freeCompilerArgs = compilerArgs
        }
    }
    

    我想同样的方法也适用于ExperimentalUnsignedTypes

    【讨论】:

    • 这适用于 Kotlin JS(可能还有 Java 和通用)项目,但不适用于多平台项目。感谢解决方案的第一部分!
    • 这很可能是因为我自己的多平台子项目目前只支持 JS 和 JVM 目标。对于本机,可能还有其他编译任务。不过,我希望有一种更通用的方法,这有点 hacky。
    • 这对languageSettings.useExperimentalAnnotation的多平台项目根本不起作用(我自己的项目只有通用和js代码atm)
    • 所有这些任务都有一个共同的超类型。也许这会做的事情:tasks.withType&lt;org.jetbrains.kotlin.gradle.dsl.KotlinCompile&lt;*&gt;&gt;().configureEach { kotlinOptions.freeCompilerArgs += compilerArgs }?
    【解决方案2】:

    推荐的共享配置方式是通过convention plugin

    即在 buildSrc/src/main/kotlin/package/name/kotlin-mpp-conventions.kts 中创建一个文件,其内容为:

    plugins {
        kotlin("jvm")
    }
    
    kotlin {
        sourceSets {
            all {
                languageSettings.useExperimentalAnnotation("kotlin.ExperimentalUnsignedTypes")
            }
        }
    }
    

    然后通过在插件块中添加对它的引用,从您的 Kotlin MPP 子项目中依赖此插件:id("package.name.kotlin-mpp-conventions")

    添加更多插件,例如Kotlin JS 项目。如果您想在所有类型的项目之间共享一些配置,您可以创建一个其他插件依赖的通用插件。您还可以通过简单地将它们放在一个单独的文件中并从插件文件中引用它们来在插件之间共享数据结构(就像使用普通代码一样),我使用这种机制来共享我想要允许的 Kotlin 实验注释列表插件。

    请务必为插件设置 buildSrc/build.gradle.kts:

    plugins {
        `kotlin-dsl`
    }
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.21")
    }
    

    【讨论】:

      猜你喜欢
      • 2015-05-28
      • 2012-07-10
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2012-06-17
      • 2017-04-29
      • 2013-11-26
      • 1970-01-01
      相关资源
      最近更新 更多