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

Daa*_*aan 6 gradle kotlin kotlin-multiplatform kotlin-js

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

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

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

    extensions.findByType<KotlinMultiplatformExtension>()?.sourceSets {
        all {
            languageSettings.useExperimentalAnnotation("kotlin.ExperimentalUnsignedTypes")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Jof*_*rey 6

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

我有一个包含一些多平台、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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 所有这些任务都有一个共同的超类型。也许这会做这样的事情:`tasks.withType&lt;org.jetbrains.kotlin.gradle.dsl.KotlinCompile&lt;*&gt;&gt;().configureEach { kotlinOptions.freeCompilerArgs += compilerArgs }`? (2认同)

Daa*_*aan 4

共享配置的推荐方法是通过约定插件

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

plugins {
    kotlin("jvm")
}

kotlin {
    sourceSets {
        all {
            languageSettings.useExperimentalAnnotation("kotlin.ExperimentalUnsignedTypes")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后通过在插件块中添加对它的引用来依赖 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")
}
Run Code Online (Sandbox Code Playgroud)