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

10

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

目前我尝试了以下方法,但未成功:

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

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

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

2个回答

8

我通过尝试和错误到达了这个地步,所以我不确定这是正确的方法。

我有一个多项目构建,其中包括一些多平台、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和通用)项目,但不适用于多平台项目。不过还是感谢您提供的第一部分解决方案! - Daan
这很可能是因为我的多平台子项目目前只支持JS和JVM目标。对于本地,可能会有其他编译任务。我希望有一个更通用的方法,这种方法有点hacky。 - Joffrey
1
这对于具有languageSettings.useExperimentalAnnotation的多平台项目根本不起作用(目前我的项目仅具有公共和js代码)。 - Daan
2
所有这些任务都有一个共同的超类型。也许可以通过以下方式来实现:tasks.withType<org.jetbrains.kotlin.gradle.dsl.KotlinCompile<*>>().configureEach { kotlinOptions.freeCompilerArgs += compilerArgs } - Михаил Нафталь
org.jetbrains.kotlin.gradle.dsl.KotlinCompile完成了任务,谢谢。 - Dmitry Kolesnikovich

4

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

即,在buildSrc/src/main/kotlin/package/name/目录下创建一个文件,命名为kotlin-mpp-conventions.kts,并将以下内容写入该文件:

plugins {
    kotlin("jvm")
}

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

将此插件添加到您的Kotlin MPP子项目中,在plugins块中添加对其的引用: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")
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接