Настройка компиляций
Проекты Kotlin multiplatform используют компиляции для создания артефактов. Каждый целевой набор может иметь одну или несколько компиляций, например, для целей производства и тестирования.
Для каждого целевого набора по умолчанию включены следующие компиляции:
-
mainиtestкомпиляции для JVM, JS и Native целевых наборов. - Компиляция на основе компиляции для каждого варианта сборки Android для целевых наборов Android.
Если вам необходимо скомпилировать что-то помимо кода для производства и юнит-тестов, например, интеграционные или производительные тесты, вы можете создать пользовательскую компиляцию.
Вы можете настроить создание артефактов в следующих случаях:
- Все компиляции в вашем проекте сразу.
- Компиляции для одного целевого набора, так как один целевой набор может иметь несколько компиляций.
- Конкретную компиляцию.
См. список параметров компиляции и параметры компилятора, доступные для всех или конкретных целевых наборов.
Настройка всех компиляций
kotlin {
targets.all {
compilations.all {
kotlinOptions {
allWarningsAsErrors = true
}
}
}
}
Настройка компиляций для одного целевого набора
kotlin {
jvm().compilations.all {
kotlinOptions {
sourceMap = true
metaInfo = true
}
}
}
kotlin {
targets.jvm.compilations.all {
kotlinOptions {
sourceMap = true
metaInfo = true
}
}
}
Настройка одной компиляции
kotlin {
jvm().compilations.main {
kotlinOptions {
jvmTarget = "1.8"
}
}
}
kotlin {
jvm {
val main by compilations.getting {
kotlinOptions {
jvmTarget = "1.8"
}
}
}
}
Создание пользовательской компиляции
Если вам нужно скомпилировать что-то помимо кода для производства и юнит-тестов, например, интеграционные или производительные тесты, создайте пользовательскую компиляцию.
Например, чтобы создать пользовательскую компиляцию для интеграционных тестов целевого набора jvm(), добавьте новую запись в коллекцию compilations.
Для пользовательских компиляций вам необходимо вручную настроить все зависимости. По умолчанию набор исходных файлов пользовательской компиляции не зависит от наборов исходных файлов
commonMainиcommonTest.
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.create('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
}
}
}
}
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.create<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
}
}
}
}
}
Вам также может потребоваться создание пользовательской компиляции в других случаях, например, если вы хотите объединить компиляции для разных версий JVM в конечном артефакте или уже настроите наборы исходных файлов в Gradle и хотите перейти на многоплатформенный проект.
Включение Java-исходников в JVM-компиляции
По умолчанию целевой набор JVM игнорирует Java-исходники и компилирует только Kotlin-файлы.
Чтобы включить Java-исходники в компиляции целевого набора JVM, явно включите поддержку Java-языка для целевого набора:
-
При создании проекта с помощью мастера проектов.
-
В скрипте сборки существующего проекта.
kotlin { jvm { withJava() } }Это применяет плагин Gradle
javaи настраивает целевой набор для взаимодействия с ним.
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, помеченные атрибутом @objc. |
Компиляция может взаимодействовать с несколькими нативными библиотеками. Настройте взаимодействие в блоке cinterops компиляции с доступными параметрами.
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 { /* ... */ }
}
}
}
}
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 { /* ... */ }
}
}
}
Компиляция для Android
Компиляции, созданные для целевого набора Android по умолчанию, привязаны к вариантам сборки Android: для каждого варианта сборки создается Kotlin-компиляция с тем же именем.
Затем для каждого набора исходных файлов Android, скомпилированного для каждого варианта, создается набор исходных файлов Kotlin под этим именем, префикс которого - имя целевого набора, например, набор исходных файлов Kotlin androidDebug для набора исходных файлов Android debug и целевого набора Kotlin android. Эти наборы исходных файлов Kotlin добавляются в компиляции вариантов соответственно.
По умолчанию набор исходных файлов commonMain добавляется в компиляцию каждого производственного варианта (приложения или библиотеки). Набор исходных файлов commonTest аналогичным образом добавляется в компиляции вариантов юнит-тестов и instrumented-тестов.
Обработка аннотаций с помощью 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–2020 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/reference/mpp-configure-compilations.html