Spec-Zone.ru › Kotlin 1.8

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

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

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

  • main и test компиляции для JVM, JS и Native-целей.

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

Compilations

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

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

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

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

  • Настройка конкретной компиляции.

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

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

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.

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

Использование 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 и Kotlin-целевого объекта, названного 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 могут быть установлены произвольно.

Последнее изменение: 10 января 2023
Запуск тестов с Kotlin Multiplatform Создание конечных нативных библиотек (экспериментальный DSL)

© 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

Spec-Zone.ru

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