如何将 -Xopt-in=kotlin.ExperimentalUnsignedTypes 应用于所有子项目?

How to apply -Xopt-in=kotlin.ExperimentalUnsignedTypes to all subprojects?

我有一个包含多个子项目的项目,这些子项目使用 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 中的所有子项目?

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

我有一个包含一些多平台、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

推荐的共享配置的方式是通过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")
}