Настройка компиляций
Kotlin-проекты с многоплатформенностью используют компиляции для создания артефактов. Каждый целевой объект может иметь одну или несколько компиляций, например, для целей производства и тестирования.
Для каждого целевого объекта по умолчанию включены следующие компиляции:
mainиtestкомпиляции для JVM, JS и Native-целей.Компиляция на каждую компиляцию в варианте сборки Android для Android-целей.

Если вам необходимо скомпилировать что-то помимо кода производства и юнит-тестов, например, интеграционные или производительные тесты, вы можете создать пользовательскую компиляцию.
Вы можете настроить, как производятся артефакты, в:
Настройка всех компиляций в вашем проекте сразу.
Настройка компиляций для одного целевого объекта, так как один целевой объект может иметь несколько компиляций.
См. список параметров компиляции и параметры компилятора, доступные для всех или определенных целевых объектов.
Настройка всех компиляций
kotlin {
targets.all {
compilations.all {
compilerOptions.configure {
allWarningsAsErrors.set(true)
}
}
}
}
Настройка компиляций для одного целевого объекта
kotlin {
targets.jvm.compilations.all {
compilerOptions.configure {
sourceMap.set(true)
metaInfo.set(true)
}
}
}
kotlin {
jvm().compilations.all {
compilerOptions.configure {
sourceMap.set(true)
metaInfo.set(true)
}
}
}
Настройка одной компиляции
kotlin {
jvm {
val main by compilations.getting {
compilerOptions.configure {
jvmTarget.set(JvmTarget.JVM_1_8)
}
}
}
}
kotlin {
jvm().compilations.main {
compilerOptions.configure {
jvmTarget.set(JvmTarget.JVM_1_8)
}
}
}
Создание пользовательской компиляции
Если вам необходимо скомпилировать что-то помимо кода производства и юнит-тестов, например, интеграционные или производительные тесты, создайте пользовательскую компиляцию.
Например, чтобы создать пользовательскую компиляцию для интеграционных тестов jvm() целевого объекта, добавьте новый элемент в коллекцию compilations.
kotlin {
jvm() {
compilations {
val main by getting
val integrationTest by compilations.creating {
defaultSourceSet {
dependencies {
// Compile against the main compilation's compile classpath and outputs:
implementation(main.compileDependencyFiles + main.output.classesDirs)
implementation(kotlin("test-junit"))
/* ... */
}
}
// Create a test task to run the tests produced by this compilation:
tasks.register<Test>("integrationTest") {
// Run the tests with the classpath containing the compile dependencies (including 'main'),
// runtime dependencies, and the outputs of this compilation:
classpath = compileDependencyFiles + runtimeDependencyFiles + output.allOutputs
// Run only the tests from this compilation's outputs:
testClassesDirs = output.classesDirs
}
}
}
}
}
kotlin {
jvm() {
compilations.create('integrationTest') {
defaultSourceSet {
dependencies {
def main = compilations.main
// Compile against the main compilation's compile classpath and outputs:
implementation(main.compileDependencyFiles + main.output.classesDirs)
implementation kotlin('test-junit')
/* ... */
}
}
// Create a test task to run the tests produced by this compilation:
tasks.register('jvmIntegrationTest', Test) {
// Run the tests with the classpath containing the compile dependencies (including 'main'),
// runtime dependencies, and the outputs of this compilation:
classpath = compileDependencyFiles + runtimeDependencyFiles + output.allOutputs
// Run only the tests from this compilation's outputs:
testClassesDirs = output.classesDirs
}
}
}
}
Также вам нужно создать пользовательскую компиляцию в других случаях, например, если вы хотите объединить компиляции для различных версий JVM в ваш конечный артефакт или уже настроили наборы исходных файлов в Gradle и хотите перейти на многоплатформенный проект.
Использование Java-источников в JVM-компиляциях
При создании проекта с помощью мастера проектов, Java-источники включаются в компиляции JVM-целевого объекта.
В скрипте сборки следующий раздел применяет плагин Gradle java и настраивает целевой объект для взаимодействия с ним:
kotlin {
jvm {
withJava()
}
}
Файлы Java-источников размещаются в дочерних каталогах корневых каталогов Kotlin-источников. Например, пути:

Общие наборы исходных файлов не могут содержать Java-источники.
Из-за текущих ограничений плагин Kotlin заменяет некоторые задачи, настроенные плагином Java:
Задача JAR целевого объекта вместо
jar(например,jvmJar).Задача теста целевого объекта вместо
test(например,jvmTest).Обработка ресурсов выполняется эквивалентными задачами компиляций вместо задач
*ProcessResources.
Публикация этого целевого объекта выполняется плагином Kotlin и не требует шагов, специфичных для плагина Java.
Настройка взаимодействия с языками нативных платформ
Kotlin предоставляет взаимодействие с языками нативных платформ и DSL для настройки этого для конкретной компиляции.
Язык нативной платформы |
Поддерживаемые платформы |
Комментарии |
|---|---|---|
C |
Все платформы, кроме WebAssembly |
|
Objective-C |
Платформы Apple (macOS, iOS, watchOS, tvOS) |
|
Swift через Objective-C |
Платформы Apple (macOS, iOS, watchOS, tvOS) |
Kotlin может использовать только объявления Swift, помеченные атрибутом |
Компиляция может взаимодействовать с несколькими библиотеками нативных платформ. Настройте взаимодействие в блоке cinterops компиляции с доступными параметрами.
kotlin {
linuxX64 { // Replace with a target you need.
compilations.getByName("main") {
val myInterop by cinterops.creating {
// Def-file describing the native API.
// The default path is src/nativeInterop/cinterop/<interop-name>.def
defFile(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 to look for headers.
includeDirs.apply {
// Directories for header search (an equivalent of the -I<path> compiler option).
allHeaders("path1", "path2")
// Additional directories to search headers listed in the 'headerFilter' def-file option.
// -headerFilterAdditionalSearchPrefix command line option equivalent.
headerFilterOnly("path1", "path2")
}
// A shortcut for includeDirs.allHeaders.
includeDirs("include/directory", "another/directory")
}
val anotherInterop by cinterops.creating { /* ... */ }
}
}
}
kotlin {
linuxX64 { // Replace with a target you need.
compilations.main {
cinterops {
myInterop {
// Def-file describing the native API.
// The default path is src/nativeInterop/cinterop/<interop-name>.def
defFile 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 eqivalent of the -I<path> compiler option).
includeDirs.allHeaders("path1", "path2")
// Additional directories to search headers listed in the 'headerFilter' def-file option.
// -headerFilterAdditionalSearchPrefix command line option equivalent.
includeDirs.headerFilterOnly("path1", "path2")
// A shortcut for includeDirs.allHeaders.
includeDirs("include/directory", "another/directory")
}
anotherInterop { /* ... */ }
}
}
}
}
Компиляция для Android
Компиляции, созданные для Android-целевого объекта по умолчанию, привязаны к вариантам сборки Android: для каждого варианта сборки создается Kotlin-компиляция с тем же именем.
Затем, для каждого набора исходных файлов Android, скомпилированного для каждого из вариантов, создается Kotlin-набор исходных файлов под тем же именем, что и набор исходных файлов, но с добавлением имени целевого объекта, например, Kotlin-набор исходных файлов androidDebug для Android-набора исходных файлов debug и Kotlin-целевого объекта, названного android. Эти Kotlin-наборы исходных файлов соответственно добавляются в компиляции вариантов.
Набор исходных файлов commonMain по умолчанию добавляется в компиляцию каждого варианта производства (приложения или библиотеки). Набор исходных файлов commonTest аналогичным образом добавляется в компиляции вариантов юнит-тестов и инструментированных тестов.
Обработка аннотаций с помощью kapt также поддерживается, но из-за текущих ограничений она требует, чтобы Android-целевой объект был создан до настройки зависимостей kapt, что необходимо сделать в верхнем уровне блоке dependencies вместо зависимостей в наборе исходных файлов Kotlin.
kotlin {
android { /* ... */ }
}
dependencies {
kapt("com.my.annotation:processor:1.0.0")
}
Компиляция иерархии наборов исходных данных
Kotlin может создать иерархию наборов исходных данных dependsOn.

Если набор исходных данных jvmMain зависит от набора исходных данных commonMain, то:
При каждой компиляции
jvmMainдля определённой платформы,commonMainтакже участвует в этой компиляции и компилируется в тот же бинарный формат, такой как файлы классов JVM.Источники
jvmMainвидят объявленияcommonMain, включая внутренние объявления, а также зависимостиcommonMain, даже те, что указаны как зависимостиimplementation.jvmMainможет содержать платформенно-специфичные реализации для ожидаемых объявленийcommonMain.Ресурсы
commonMainвсегда обрабатываются и копируются вместе с ресурсамиjvmMain.Настройки языка
jvmMainиcommonMainдолжны быть согласованы.
Согласованность настроек языка проверяется следующим образом:
jvmMainдолжен устанавливать значениеlanguageVersion, которое больше или равно значениюcommonMain.jvmMainдолжен включать все нестабильные языковые возможности, включённые вcommonMain(такого требования нет для исправлений ошибок).jvmMainдолжен использовать все экспериментальные аннотации, используемыеcommonMain.apiVersion, исправления ошибок иprogressiveModeмогут быть установлены произвольно.
© 2010–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/multiplatform-configure-compilations.html