Spec-Zone.ru › Kotlin 1.4

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

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

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

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

Compilations

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

Вы можете настроить создание артефактов в следующих случаях:

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

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

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

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-языка для целевого набора:

  • При создании проекта с помощью мастера проектов.

    Enable Java language support

  • В скрипте сборки существующего проекта.

    kotlin {
        jvm {
            withJava()
        }
    }
    

    Это применяет плагин Gradle java и настраивает целевой набор для взаимодействия с ним.

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.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.

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

© 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

Spec-Zone.ru

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