Как применить -Xopt-in=kotlin.ExperimentalUnsignedTypes ко всем подпроектам?

#kotlin #gradle #kotlin-multiplatform #kotlin-js

#kotlin #gradle #kotlin-мультиплатформенный #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")
        }
    }
}
  

Есть ли способ добавить аргумент компилятора kotlin -Xopt-in=kotlin.ExperimentalUnsignedTypes ко всем подпроектам в Gradle?

Ответ №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 .

Комментарии:

1. Это работает для проектов Kotlin JS (и, вероятно, Java и common), но не для мультиплатформенных проектов. Однако спасибо за первую часть решения!

2. Скорее всего, это связано с тем, что мои собственные мультиплатформенные подпроекты на данный момент поддерживают только цели JS и JVM. Для native могут быть другие задачи компиляции. Я бы надеялся на более общий подход, хотя это довольно банально.

3. Это просто не работает для мультиплатформенных проектов с languageSettings.useExperimentalAnnotation (мои собственные проекты имеют только common и js code atm)

4. Для всех этих задач существует общий супертип. Может быть, это поможет: tasks.withType<org.jetbrains.kotlin.gradle.dsl.KotlinCompile<*>>().configureEach { kotlinOptions.freeCompilerArgs = compilerArgs } ?

5. org.jetbrains. kotlin.gradle.dsl.KotlinCompile выполнил задание, спасибо

Ответ №2:

Рекомендуемый способ совместного использования конфигурации — через плагин соглашения.

Т.е. создайте файл в 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")
}