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