Справочник по DSL Gradle для Kotlin Multiplatform
Плагин Kotlin Multiplatform для Gradle — это инструмент для создания проектов Kotlin Multiplatform. Здесь приведен справочник по его содержимому; используйте его как памятку при написании сценариев сборки Gradle для проектов Kotlin Multiplatform. Узнайте о концепциях проектов Kotlin Multiplatform, а также о том, как создавать и настраивать такие проекты.
Идентификатор и версия
Полное имя плагина Kotlin Multiplatform для Gradle — org.jetbrains.kotlin.multiplatform. Если вы используете DSL Kotlin для Gradle, применить плагин можно с помощью kotlin("multiplatform"). Версии плагина соответствуют версиям выпусков Kotlin. Последняя версия — 2.4.20.
plugins {
kotlin("multiplatform") version "2.4.20"
}
plugins {
id 'org.jetbrains.kotlin.multiplatform' version '2.4.20'
}
Блоки верхнего уровня
kotlin {} — это блок верхнего уровня для настройки многоплатформенного проекта в сценарии сборки Gradle. Внутри kotlin {} можно использовать следующие блоки:
Блок |
Описание |
|---|---|
<targetName> |
Объявляет конкретную цель проекта. Имена доступных целей перечислены в разделе «Цели». |
|
Перечисляет все цели проекта. |
|
Настраивает предопределенные и объявляет пользовательские наборы исходного кода проекта. |
|
Задает общие параметры компилятора на уровне расширения, используемые по умолчанию для всех целей и общих наборов исходного кода. |
|
Настраивает общие зависимости. (Экспериментальная возможность) |
Цели
Цель — это часть сборки, отвечающая за компиляцию, тестирование и упаковку программного обеспечения, предназначенного для одной из поддерживаемых платформ. Kotlin предоставляет цели для каждой платформы, поэтому вы можете указать Kotlin, для какой именно цели следует компилировать код. Подробнее о том, как настроить цели.
У каждой цели может быть одна или несколько компиляций. Помимо компиляций по умолчанию для тестирования и выпуска продукта, вы можете создавать пользовательские компиляции.
Цели многоплатформенного проекта описываются в соответствующих блоках внутри kotlin {}, например jvm, android, iosArm64. Полный список доступных целей:
Целевая платформа |
Цель |
Комментарии |
|---|---|---|
Kotlin/JVM |
|
|
Kotlin/Wasm |
|
Выберите эту цель, если планируете запускать проекты в среде выполнения JavaScript. |
|
Выберите эту цель, если вам нужна поддержка системного интерфейса WASI. |
|
Kotlin/JS |
|
Выберите среду выполнения:
Подробнее см. в разделе Настройка проекта Kotlin/JS. |
Kotlin/Native |
О поддерживаемых в настоящее время целях для хостов macOS, Linux и Windows см. в разделе Поддержка целей Kotlin/Native. |
|
Приложения и библиотеки Android |
|
Примените плагин Android Gradle вручную: Для каждого подпроекта Gradle можно создать только одну цель Android. |
kotlin {
jvm()
iosArm64()
macosArm64()
js().browser()
}
Конфигурация цели может включать две части:
Общая конфигурация, доступная для всех целей.
Конфигурация, специфичная для цели.
У каждой цели может быть одна или несколько компиляций.
Общая конфигурация цели
В любом блоке цели можно использовать следующие объявления:
Имя |
Описание |
|---|---|
|
Платформа Kotlin для этой цели. Доступные значения: |
|
Имя задачи, которая собирает итоговые артефакты этой цели. |
|
Компоненты, используемые для настройки публикаций Gradle. |
|
Параметры компилятора, используемые для цели. Это объявление переопределяет любые |
Веб-цели
Блок js {} описывает конфигурацию целей Kotlin/JS, а блок wasmJs {} — конфигурацию целей Kotlin/Wasm, совместимых с JavaScript. В зависимости от среды выполнения цели они могут содержать один из двух блоков:
Подробнее о настройке проектов Kotlin/JS.
Отдельный блок wasmWasi {} описывает конфигурацию целей Kotlin/Wasm, поддерживающих системный интерфейс WASI. Он поддерживает среды выполнения nodejs и wasmtime:
kotlin {
wasmWasi {
nodejs()
wasmtime()
binaries.executable()
}
}
Все веб-цели — js, wasmJs и wasmWasi — также поддерживают вызов binaries.executable(). Он явно указывает компилятору Kotlin создавать исполняемые файлы. Дополнительную информацию см. в разделе Среды выполнения документации Kotlin/JS.
Браузер
browser {} может содержать следующие блоки конфигурации:
Имя |
Описание |
|---|---|
|
Настройка выполнения тестов. |
|
Настройка запуска проекта. |
|
Настройка сборки проекта с помощью Webpack. |
|
Путь к выходным файлам. |
kotlin {
js().browser {
webpackTask { /* ... */ }
testRuns { /* ... */ }
distribution {
directory = File("$projectDir/customdir/")
}
}
}
Node.js
nodejs {} может содержать конфигурации задач тестирования и запуска:
Имя |
Описание |
|---|---|
|
Настройка выполнения тестов. |
|
Настройка запуска проекта. |
kotlin {
js().nodejs {
runTask { /* ... */ }
testRuns { /* ... */ }
}
}
Нативные цели
Для нативных целей доступны следующие специальные блоки:
Имя |
Описание |
|---|---|
|
Настройка создаваемых бинарных файлов. |
|
Настройка взаимодействия с библиотеками C. |
Бинарные файлы
Доступны следующие типы бинарных файлов:
Имя |
Описание |
|---|---|
|
Исполняемый файл продукта. |
|
Исполняемый файл тестов. |
|
Динамическая библиотека. |
|
Статическая библиотека. |
|
Фреймворк Objective-C. |
kotlin {
linuxX64 { // Use your target instead.
binaries {
executable {
// Binary configuration.
}
}
}
}
Для настройки бинарных файлов доступны следующие параметры:
Имя |
Описание |
|---|---|
|
Компиляция, на основе которой создается бинарный файл. По умолчанию бинарные файлы |
|
Параметры, передаваемые системному компоновщику при сборке бинарного файла. |
|
Пользовательское базовое имя выходного файла. Итоговое имя файла будет сформировано добавлением к нему системно-зависимых префикса и суффикса. |
|
Точка входа для исполняемых бинарных файлов. По умолчанию это |
|
Доступ к выходному файлу. |
|
Доступ к задаче компоновки. |
|
Доступ к задаче запуска для исполняемых бинарных файлов. Для целей, отличных от |
|
Для фреймворков Objective-C. Включает статическую библиотеку вместо динамической. |
|
Отключает кэш компиляции. Используйте этот параметр только в исключительных случаях, так как он увеличивает время компиляции. Необходимо указать компонент Kotlin |
binaries {
executable("my_executable", listOf(RELEASE)) {
// Build a binary on the basis of the test compilation.
compilation = compilations["test"]
// Custom command line options for the linker.
linkerOpts = mutableListOf("-L/lib/search/path", "-L/another/search/path", "-lmylib")
// Base name for the output file.
baseName = "foo"
// Custom entry point function.
entryPoint = "org.example.main"
// Accessing the output file.
println("Executable path: ${outputFile.absolutePath}")
// Accessing the link task.
linkTask.dependsOn(additionalPreprocessingTask)
// Accessing the run task.
// Note that the runTask is null for non-host platforms.
runTask?.dependsOn(prepareForRun)
}
framework("my_framework" listOf(RELEASE)) {
// Include a static library instead of a dynamic one into the framework.
isStatic = true
// Disable compilation cache for this binary
disableNativeCache(
version = DisableCacheInKotlinVersion.2_3_0,
reason = "Cache bug",
issue = URI("https://youtrack.com/YY-1111")
)
}
}
binaries {
executable('my_executable', [RELEASE]) {
// Build a binary on the basis of the test compilation.
compilation = compilations.test
// Custom command line options for the linker.
linkerOpts = ['-L/lib/search/path', '-L/another/search/path', '-lmylib']
// Base name for the output file.
baseName = 'foo'
// Custom entry point function.
entryPoint = 'org.example.main'
// Accessing the output file.
println("Executable path: ${outputFile.absolutePath}")
// Accessing the link task.
linkTask.dependsOn(additionalPreprocessingTask)
// Accessing the run task.
// Note that the runTask is null for non-host platforms.
runTask?.dependsOn(prepareForRun)
}
framework('my_framework' [RELEASE]) {
// Include a static library instead of a dynamic one into the framework.
isStatic = true
// Disable compilation cache for this binary
disableNativeCache(
version = DisableCacheInKotlinVersion .2_3_0,
reason = 'Cache bug',
issue = URI('https://youtrack.com/YY-1111')
)
}
}
Подробнее о сборке нативных бинарных файлов.
Cinterop
cinterops — это набор описаний для взаимодействия с нативными библиотеками. Чтобы обеспечить взаимодействие с библиотекой, добавьте запись в cinterops и задайте ее параметры:
Имя |
Описание |
|---|---|
|
Файл |
|
Префикс пакета для сгенерированного API Kotlin. |
|
Параметры, передаваемые компилятору инструментом cinterop. |
|
Каталоги для поиска заголовочных файлов. |
|
Заголовочный файл, который нужно включить в привязки. |
|
Список заголовочных файлов, которые нужно включить в привязки. |
kotlin {
linuxX64 { // Replace with a target you need.
compilations.getByName("main") {
val myInterop by cinterops.creating {
// Definition file describing the native API.
// The default path is src/nativeInterop/cinterop/<interop-name>.def
definitionFile.set(project.file("def-file.def"))
// Package to place the Kotlin API generated.
packageName("org.sample")
// Options to be passed to compiler by cinterop tool.
compilerOpts("-Ipath/to/headers")
// Directories for header search (an analogue of the -I<path> compiler option).
includeDirs.allHeaders("path1", "path2")
// A shortcut for includeDirs.allHeaders.
includeDirs("include/directory", "another/directory")
// Header files to be included in the bindings.
header("path/to/header.h")
headers("path/to/header1.h", "path/to/header2.h")
}
val anotherInterop by cinterops.creating { /* ... */ }
}
}
}
kotlin {
linuxX64 { // Replace with a target you need.
compilations.main {
cinterops {
myInterop {
// Definition file describing the native API.
// The default path is src/nativeInterop/cinterop/<interop-name>.def
definitionFile = project.file("def-file.def")
// Package to place the Kotlin API generated.
packageName 'org.sample'
// Options to be passed to compiler by cinterop tool.
compilerOpts '-Ipath/to/headers'
// Directories for header search (an analogue of the -I<path> compiler option).
includeDirs.allHeaders("path1", "path2")
// A shortcut for includeDirs.allHeaders.
includeDirs("include/directory", "another/directory")
// Header files to be included in the bindings.
header("path/to/header.h")
headers("path/to/header1.h", "path/to/header2.h")
}
anotherInterop { /* ... */ }
}
}
}
}
Дополнительные свойства cinterop см. в разделе Файл описания.
Цели Android
Плагин Kotlin Multiplatform для Gradle содержит специальную функцию, которая помогает настраивать варианты сборки для цели Android:
Имя |
Описание |
|---|---|
|
Задает варианты сборки для публикации. Подробнее о публикации библиотек Android. |
kotlin {
android {
publishLibraryVariants("release")
}
}
Подробнее о компиляции для Android.
Наборы исходного кода
Блок sourceSets {} описывает наборы исходного кода проекта. Набор исходного кода содержит файлы исходного кода Kotlin, которые участвуют в компиляциях вместе со своими ресурсами и зависимостями.
Многоплатформенный проект содержит предопределенные наборы исходного кода для своих целей; разработчики также могут создавать пользовательские наборы в соответствии со своими потребностями.
Предопределенные наборы исходного кода
Предопределенные наборы исходного кода настраиваются автоматически при создании многоплатформенного проекта. Доступны следующие предопределенные наборы:
Имя |
Описание |
|---|---|
|
Код и ресурсы, общие для всех платформ. Доступен во всех многоплатформенных проектах. Используется во всех основных компиляциях проекта. |
|
Тестовый код и ресурсы, общие для всех платформ. Доступен во всех многоплатформенных проектах. Используется во всех тестовых компиляциях проекта. |
<targetName><compilationName> |
Исходный код для конкретной цели и компиляции. <targetName> — имя предопределенной цели, а <compilationName> — имя компиляции для этой цели. Примеры: |
kotlin {
//...
sourceSets {
commonMain { /* ... */ }
}
}
kotlin {
//...
sourceSets {
commonMain { /* ... */ }
}
}
Подробнее о наборах исходного кода.
Пользовательские наборы исходного кода
Пользовательские наборы исходного кода создаются разработчиками проекта вручную. Чтобы создать пользовательский набор, добавьте раздел с его именем внутри раздела sourceSets. При использовании DSL Kotlin для Gradle помечайте пользовательские наборы исходного кода как by creating.
kotlin {
//...
sourceSets {
val myMain by creating { /* ... */ } // create a new source set by the name 'MyMain'
}
}
kotlin {
//...
sourceSets {
myMain { /* ... */ } // create or configure a source set by the name 'myMain'
}
}
Обратите внимание: созданный набор исходного кода не связан с другими наборами. Чтобы использовать его в компиляциях проекта, свяжите его с другими наборами исходного кода.
Параметры набора исходного кода
Конфигурации наборов исходного кода хранятся в соответствующих блоках sourceSets {}. У набора исходного кода есть следующие параметры:
Имя |
Описание |
|---|---|
|
Расположение файлов исходного кода Kotlin в каталоге набора исходного кода. |
|
Расположение ресурсов в каталоге набора исходного кода. |
|
|
|
Зависимости набора исходного кода. |
|
Настройки языка, применяемые к общему набору исходного кода. |
kotlin {
//...
sourceSets {
commonMain {
kotlin.srcDir("src")
resources.srcDir("res")
dependencies {
/* ... */
}
}
}
}
kotlin {
//...
sourceSets {
commonMain {
kotlin.srcDir('src')
resources.srcDir('res')
dependencies {
/* ... */
}
}
}
}
Компиляции
У цели может быть одна или несколько компиляций, например для production или тестирования. Существуют предопределённые компиляции, которые добавляются автоматически при создании цели. Кроме того, можно создавать пользовательские компиляции.
Чтобы обратиться ко всем компиляциям цели или к некоторым из них, используйте коллекцию объектов compilations. С помощью compilations можно обратиться к компиляции по её имени.
Подробнее о настройке компиляций.
Предопределённые компиляции
Предопределённые компиляции создаются автоматически для каждой цели проекта, кроме целей Android. Доступны следующие предопределённые компиляции:
Имя |
Описание |
|---|---|
|
Компиляция исходного кода для production. |
|
Компиляция для тестов. |
kotlin {
jvm {
val main by compilations.getting {
output // get the main compilation output
}
compilations["test"].runtimeDependencyFiles // get the test runtime classpath
}
}
kotlin {
jvm {
compilations.main.output // get the main compilation output
compilations.test.runtimeDependencyFiles // get the test runtime classpath
}
}
Пользовательские компиляции
Помимо предопределённых компиляций, можно создавать собственные пользовательские компиляции. Для этого настройте отношение associateWith между новой компиляцией и компиляцией main. Если вы используете Kotlin Gradle DSL, пометьте пользовательские компиляции с помощью by creating:
kotlin {
jvm {
compilations {
val main by getting
val integrationTest by creating {
// Import main and its classpath as dependencies and establish internal visibility
associateWith(main)
defaultSourceSet {
dependencies {
implementation(kotlin("test-junit"))
/* ... */
}
}
// Create a test task to run the tests produced by this compilation
testRuns.create("integration") {
// Configure the test task
setExecutionSourceFrom(integrationTest)
}
}
}
}
}
kotlin {
jvm {
compilations.create('integrationTest') {
def main = compilations.main
// Import main and its classpath as dependencies and establish internal visibility
associateWith(main)
defaultSourceSet {
dependencies {
implementation kotlin('test-junit')
/* ... */
}
}
// Create a test task to run the tests produced by this compilation
testRuns.create('integration') {
// Configure the test task
setExecutionSourceFrom(compilations.integrationTest)
}
}
}
}
Связывая компиляции, вы добавляете выходные данные основной компиляции в качестве зависимости и устанавливаете видимость internal между компиляциями.
Подробнее о создании пользовательских компиляций.
Параметры компиляции
Компиляция имеет следующие параметры:
Имя |
Описание |
|---|---|
|
Набор исходного кода компиляции по умолчанию. |
|
Наборы исходного кода, участвующие в компиляции. |
|
Наборы исходного кода, участвующие в компиляции, и их связи через |
|
Параметры компилятора, применяемые к компиляции. Список доступных параметров см. в разделе Параметры компилятора. |
|
Задача Gradle для компиляции исходного кода Kotlin. |
|
Имя |
|
Имя задачи Gradle для компиляции всего исходного кода компиляции. |
|
Результат компиляции. |
|
Файлы зависимостей времени компиляции (classpath) компиляции. Для всех компиляций Kotlin/Native сюда автоматически включаются стандартная библиотека и платформенные зависимости. |
|
Файлы зависимостей времени выполнения (classpath) компиляции. |
kotlin {
jvm {
val main by compilations.getting {
compileTaskProvider.configure {
compilerOptions {
// Set up the Kotlin compiler options for the 'main' compilation:
jvmTarget.set(JvmTarget.JVM_1_8)
}
}
compileKotlinTask // get the Kotlin task 'compileKotlinJvm'
output // get the main compilation output
}
compilations["test"].runtimeDependencyFiles // get the test runtime classpath
}
// Configure all compilations of all targets:
compilerOptions {
allWarningsAsErrors.set(true)
}
}
kotlin {
jvm {
compilations.main {
compileTaskProvider.configure {
compilerOptions {
// Setup the Kotlin compiler options for the 'main' compilation:
jvmTarget = JvmTarget.JVM_1_8
}
}
}
compilations.main.compileKotlinTask // get the Kotlin task 'compileKotlinJvm'
compilations.main.output // get the main compilation output
compilations.test.runtimeDependencyFiles // get the test runtime classpath
}
// Configure all compilations of all targets:
compilerOptions {
allWarningsAsErrors = true
}
}
Параметры компилятора
В проектах можно настраивать параметры компилятора на трёх разных уровнях:
Уровень расширения, в блоке
kotlin {}.Уровень цели, в блоке цели.
Уровень единицы компиляции, обычно в конкретной задаче компиляции.
Настройки более высокого уровня используются по умолчанию для уровня ниже:
Параметры компилятора, заданные на уровне расширения, используются по умолчанию для параметров уровня цели, включая общие наборы исходного кода, такие как
commonMain,nativeMainиcommonTest.Параметры компилятора, заданные на уровне цели, используются по умолчанию для параметров уровня единицы компиляции (задачи), например для задач
compileKotlinJvmиcompileTestKotlinJvm.
Настройки, заданные на более низком уровне, переопределяют аналогичные настройки более высоких уровней:
Параметры компилятора на уровне задачи переопределяют аналогичные настройки на уровне цели или расширения.
Параметры компилятора на уровне цели переопределяют аналогичные настройки на уровне расширения.
Список возможных параметров компилятора см. в разделе Все параметры компилятора.
Уровень расширения
Чтобы настроить параметры компилятора для всех целей проекта, используйте блок compilerOptions {} на верхнем уровне:
kotlin {
// Configures all compilations of all targets
compilerOptions {
allWarningsAsErrors.set(true)
}
}
kotlin {
// Configures all compilations of all targets:
compilerOptions {
allWarningsAsErrors = true
}
}
Уровень цели
Чтобы настроить параметры компилятора для конкретной цели проекта, используйте блок compilerOptions {} внутри блока цели:
kotlin {
jvm {
// Configures all compilations of the JVM target
compilerOptions {
allWarningsAsErrors.set(true)
}
}
}
kotlin {
jvm {
// Configures all compilations of the JVM target
compilerOptions {
allWarningsAsErrors = true
}
}
}
Уровень единицы компиляции
Чтобы настроить параметры компилятора для конкретной задачи, используйте блок compilerOptions {} внутри задачи:
task.named<KotlinJvmCompile>("compileKotlinJvm") {
compilerOptions {
allWarningsAsErrors.set(true)
}
}
task.named<KotlinJvmCompile>("compileKotlinJvm") {
compilerOptions {
allWarningsAsErrors = true
}
}
Чтобы настроить параметры компилятора для конкретной компиляции, используйте блок compilerOptions {} в поставщике задач компиляции:
kotlin {
jvm {
compilations.named(KotlinCompilation.MAIN_COMPILATION_NAME) {
compileTaskProvider.configure {
// Configures the 'main' compilation:
compilerOptions {
allWarningsAsErrors.set(true)
}
}
}
}
}
kotlin {
jvm {
compilations.named(KotlinCompilation.MAIN_COMPILATION_NAME) {
compileTaskProvider.configure {
// Configures the 'main' compilation:
compilerOptions {
allWarningsAsErrors = true
}
}
}
}
}
Переход с kotlinOptions {} на compilerOptions {}
До Kotlin 2.2.0 параметры компилятора можно было настраивать с помощью блока kotlinOptions {}. Поскольку блок kotlinOptions {} устарел в Kotlin 2.2.0, вместо него необходимо использовать блок compilerOptions {} в скриптах сборки. Подробнее см. в разделе Переход с kotlinOptions{} на compilerOptions{}.
Зависимости
Блок dependencies {} объявления набора исходного кода содержит зависимости этого набора.
Подробнее о настройке зависимостей.
Существует четыре типа зависимостей:
Имя |
Описание |
|---|---|
|
Зависимости, используемые в API текущего модуля. |
|
Зависимости, используемые в модуле, но не предоставляемые за его пределами. |
|
Зависимости, используемые только для компиляции текущего модуля. |
|
Зависимости, доступные во время выполнения, но невидимые при компиляции любого модуля. |
kotlin {
//...
sourceSets {
commonMain {
dependencies {
api("com.example:foo-metadata:1.0")
}
}
jvmMain {
dependencies {
implementation("com.example:foo-jvm:1.0")
}
}
}
}
kotlin {
//...
sourceSets {
commonMain {
dependencies {
api 'com.example:foo-metadata:1.0'
}
}
jvmMain {
dependencies {
implementation 'com.example:foo-jvm:1.0'
}
}
}
}
Кроме того, наборы исходного кода могут зависеть друг от друга, образуя иерархию. В этом случае используется отношение dependsOn().
Настройка зависимостей на верхнем уровне
Общие зависимости можно настроить с помощью блока dependencies {} верхнего уровня. Объявленные здесь зависимости действуют так, как если бы они были добавлены в наборы исходного кода commonMain или commonTest.
Чтобы использовать блок dependencies {} верхнего уровня, предоставьте согласие, добавив перед блоком аннотацию @OptIn(ExperimentalKotlinGradlePluginApi::class):
kotlin {
@OptIn(ExperimentalKotlinGradlePluginApi::class)
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.11.0")
}
}
kotlin {
dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.11.0'
}
}
Добавьте платформо-зависимые зависимости в блок sourceSets {} соответствующей цели.
Оставить отзыв об этой функции можно в YouTrack.
Настройки языка
Блок languageSettings {} в наборе исходного кода определяет некоторые аспекты анализа и компиляции проекта. Используйте блок languageSettings {} только для настройки параметров, относящихся именно к общему набору исходного кода. Во всех остальных случаях используйте блок compilerOptions {}, чтобы настроить параметры компилятора на уровне расширения или цели.
Доступны следующие настройки языка:
Имя |
Описание |
|---|---|
|
Обеспечивает совместимость исходного кода с указанной версией Kotlin. |
|
Разрешает использовать объявления только из библиотек Kotlin, входящих в указанную версию. |
|
Включает указанную языковую возможность. Доступные значения соответствуют языковым возможностям, которые в настоящее время являются экспериментальными или когда-либо вводились как экспериментальные. |
|
Разрешает использовать указанную аннотацию opt-in. |
|
Включает прогрессивный режим. |
kotlin {
sourceSets.all {
languageSettings.apply {
languageVersion = "2.4" // possible values: "2.0", "2.1", "2.2", "2.3", "2.4", "2.5" (EXPERIMENTAL)
apiVersion = "2.4" // possible values: "2.0", "2.1", "2.2", "2.3", "2.4", "2.5" (EXPERIMENTAL)
enableLanguageFeature("InlineClasses") // language feature name
optIn("kotlin.ExperimentalUnsignedTypes") // annotation FQ-name
progressiveMode = true // false by default
}
}
}
kotlin {
sourceSets.all {
languageSettings {
languageVersion = '2.4' // possible values: '2.0', '2.1', '2.2', '2.3', '2.4', '2.5' (EXPERIMENTAL)
apiVersion = '2.4' // possible values: '2.0', '2.1', '2.2', '2.3', '2.4', '2.5' (EXPERIMENTAL)
enableLanguageFeature('InlineClasses') // language feature name
optIn('kotlin.ExperimentalUnsignedTypes') // annotation FQ-name
progressiveMode = true // false by default
}
}
}
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/multiplatform/multiplatform-dsl-reference.html