Spec-Zone.ru › Kotlin 1.6

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

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

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

  • 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 и хотите перейти на многоплатформенный проект.

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

Последнее изменение: 07 апреля 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