Настройка компиляций
Проекты Kotlin multiplatform используют компиляции для создания артефактов. Каждый целевой платформа может иметь одну или несколько компиляций, например, для целей производства и тестирования.
Для каждой целевой платформы, по умолчанию, включаются следующие компиляции:
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 и хотите мигрировать в проект multiplatform.
Использование 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