Spec-Zone.ru › Kotlin 1.7

Настройка компиляций

Проекты Kotlin multiplatform используют компиляции для создания артефактов. Каждый целевой набор может иметь одну или несколько компиляций, например, для целей производства и тестирования.

Для каждого целевого набора, по умолчанию включаются следующие компиляции:

  • main и test компиляции для целевых наборов JVM, JS и Native.

  • Компиляция для каждой компиляции варианта сборки Android для целевых наборов Android.

Compilations

Если вам нужно скомпилировать что-то помимо кода производства и юнит-тестов, например, интеграционные или производительностные тесты, вы можете создать пользовательскую компиляцию.

Вы можете настроить, как производятся артефакты, в:

  • Всех компиляциях в вашем проекте сразу.

  • Компиляциях для одного целевого набора, так как один целевой набор может иметь несколько компиляций.

  • Конкретной компиляции.

См. список параметров компиляции и параметры компилятора, доступные для всех или конкретных целевых наборов.

Настройка всех компиляций

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.

Для пользовательских компиляций необходимо вручную настроить все зависимости. По умолчанию набор исходных файлов пользовательской компиляции не зависит от наборов исходных файлов commonMain и commonTest.

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 source files

Общие наборы исходных файлов не могут включать 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.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.

Source set hierarchy

Если набор исходных данных jvmMain зависит от набора исходных данных commonMain, то:

  • Всякий раз, когда jvmMain компилируется для определённого целевого объекта, commonMain также участвует в этой компиляции и также компилируется в ту же бинарную форму целевого объекта, такую как файлы классов JVM.

  • Исходные данные jvmMain «видят» объявления commonMain, включая внутренние объявления, а также видят зависимости набора исходных данных commonMain, даже те, которые указаны как зависимости implementation.

  • jvmMain может содержать платформоспецифические реализации для ожидаемых объявлений набора исходных данных commonMain.

  • Ресурсы набора исходных данных commonMain всегда обрабатываются и копируются вместе с ресурсами набора исходных данных jvmMain.

  • Настройки языка наборов исходных данных jvmMain и commonMain должны быть согласованы.

Согласованность настроек языка проверяется следующим образом:

  • jvmMain должен устанавливать значение languageVersion, которое больше или равно значению commonMain.

  • jvmMain должен включать все нестабильные языковые функции, которые включает commonMain (для функций исправления ошибок такого требования нет).

  • jvmMain должен использовать все экспериментальные аннотации, которые использует commonMain.

  • apiVersion, функции языка для исправления ошибок и progressiveMode могут быть установлены произвольно.

Последнее изменение: 06 сентября 2022 г.
Запуск тестов с Kotlin Multiplatform Создание конечных нативных бинарных файлов

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API