#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")
}