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

Если вам нужно скомпилировать что-то помимо кода производства и юнит-тестов, например, интеграционные или производительностные тесты, вы можете создать пользовательскую компиляцию.
Вы можете настроить, как производятся артефакты, в:
Всех компиляциях в вашем проекте сразу.
Компиляциях для одного целевого набора, так как один целевой набор может иметь несколько компиляций.
См. список параметров компиляции и параметры компилятора, доступные для всех или конкретных целевых наборов.
Настройка всех компиляций
kotlin {
targets.all {
compilations.all {
kotlinOptions {
allWarningsAsErrors = true
}
}
}
}
Настройка компиляций для одного целевого набора
kotlin {
targets.jvm.compilations.all {
kotlinOptions {
sourceMap = true
metaInfo = true
}
}
}
kotlin {
jvm().compilations.all {
kotlinOptions {
sourceMap = true
metaInfo = true
}
}
}
Настройка одной компиляции
kotlin {
jvm {
val main by compilations.getting {
kotlinOptions {
jvmTarget = "1.8"
}
}
}
}
kotlin {
jvm().compilations.main {
kotlinOptions {
jvmTarget = "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 и целевого набора 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–2022 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