Spec-Zone.ru › Kotlin 1.4

Использование Gradle

Для построения проекта Kotlin с помощью Gradle необходимо применить плагин Kotlin Gradle к проекту и настроить зависимости.

Плагин и версии

Примените плагин Kotlin Gradle, используя DSL плагинов Gradle.

Плагин Kotlin Gradle версии 1.4.10 работает с Gradle 5.4 и выше. Плагин kotlin-multiplatform требует Gradle 6.0 или выше.

plugins {
    id 'org.jetbrains.kotlin.<...>' version '1.4.10'
}
plugins {
    kotlin("<...>") version "1.4.10"
}

Заполнитель <...> должен быть заменён одним из имён плагинов, которые можно найти в следующих разделах.

Назначение для нескольких платформ

Проекты, нацеленные на несколько платформ, называемые проектами multiplatform, требуют плагин kotlin-multiplatform. Узнайте больше о плагине.

Плагин kotlin-multiplatform работает с Gradle 6.0 или выше.

plugins {
    id 'org.jetbrains.kotlin.multiplatform' version '1.4.10'
}
plugins {
    kotlin("multiplatform") version "1.4.10"
}

Назначение для JVM

Для назначения для JVM примените плагин Kotlin JVM.

plugins {
    id "org.jetbrains.kotlin.jvm" version "1.4.10"
}
plugins {
    kotlin("jvm") version "1.4.10"
}

Значение version должно быть литеральным в этом блоке, и его нельзя применять из другого скрипта сборки.

В качестве альтернативы можно использовать более старую методику apply plugin:

apply plugin: 'kotlin'

Не рекомендуется применять плагины Kotlin с apply в Gradle Kotlin DSL – почему.

Kotlin и Java исходники

Исходники Kotlin можно хранить вместе с исходниками Java в одной папке или в разных. По умолчанию используются разные папки:

project
    - src
        - main (root)
            - kotlin
            - java

Соответствующая sourceSets свойство нужно обновить, если не используется соглашение по умолчанию:

sourceSets {
    main.kotlin.srcDirs += 'src/main/myKotlin'
    main.java.srcDirs += 'src/main/myJava'
}
sourceSets.main {
    java.srcDirs("src/main/myJava", "src/main/myKotlin")
}

Назначение для JavaScript

При назначении только для JavaScript используйте плагин kotlin-js. Узнать больше

plugins {
    id 'org.jetbrains.kotlin.js' version '1.4.10'
}
plugins {
    kotlin("js") version "1.4.10"
}

Kotlin и Java исходники

Этот плагин работает только с файлами Kotlin, поэтому рекомендуется хранить файлы Kotlin и Java отдельно (если проект содержит файлы Java). Если вы не храните их отдельно, укажите папку исходников в блоке sourceSets:

kotlin {
    sourceSets {
        main.kotlin.srcDirs += 'src/main/myKotlin'
    }
}
kotlin {
    sourceSets["main"].apply {    
        kotlin.srcDir("src/main/myKotlin") 
    }
}

Назначение для Android

Рекомендуется использовать Android Studio для создания приложений Android. Узнайте, как использовать плагин Android Gradle.

Настройка зависимостей

Чтобы добавить зависимость от библиотеки, установите зависимость требуемого типа (например, implementation) в блоке dependencies DSL набора исходных файлов.

kotlin {
    sourceSets {
        commonMain {
            dependencies {
                implementation 'com.example:my-library:1.0'
            }
        }
    }
}
kotlin {
    sourceSets {
        val commonMain by getting {
            dependencies {
                implementation("com.example:my-library:1.0")
            }
        }
    }
}

В качестве альтернативы можно установить зависимости на верхнем уровне.

Типы зависимостей

Выберите тип зависимости в зависимости от ваших потребностей.

Тип Описание Когда использовать
api Используется как во время компиляции, так и во время выполнения и экспортируется потребителям библиотек. Если любой тип из зависимости используется в публичном API текущего модуля, используйте зависимость api .
implementation Используется во время компиляции и во время выполнения для текущего модуля, но не экспортируется для компиляции других модулей, зависящих от модуля с зависимостью `implementation`.

Используйте для зависимостей, необходимых для внутренней логики модуля.

Если модуль является конечным приложением, которое не публикуется, используйте зависимости implementation вместо зависимостей api.

compileOnly Используется для компиляции текущего модуля и недоступна во время выполнения или при компиляции других модулей. Используйте для API, у которого есть стороннее внедрение, доступное во время выполнения.
runtimeOnly Доступна во время выполнения, но не видна во время компиляции любого модуля.

Зависимость от стандартной библиотеки

Зависимость от стандартной библиотеки (stdlib) в каждом наборе исходных файлов добавляется автоматически. Версия стандартной библиотеки совпадает с версией плагина Kotlin Gradle.

Для наборов исходных файлов, специфичных для платформы, используется соответствующий вариант библиотеки, специфичный для платформы, а общая стандартная библиотека добавляется в остальные. Плагин Kotlin Gradle выберет соответствующую стандартную библиотеку JVM в зависимости от kotlinOptions.jvmTarget варианта компилятора в вашем скрипте сборки Gradle.

Если вы явно объявляете зависимость от стандартной библиотеки (например, если вам нужна другая версия), плагин Kotlin Gradle не переопределит её или не добавит вторую стандартную библиотеку.

Если вам не нужна стандартная библиотека, вы можете добавить флаг исключения в gradle.properties:

kotlin.stdlib.default.dependency=false

Установите зависимости от библиотек тестов

API kotlin.test доступен для тестирования разных проектов Kotlin.

Добавьте соответствующие зависимости от библиотек тестов:

  • Для commonTest, добавьте зависимости kotlin-test-common и kotlin-test-annotations-common.
  • Для целей JVM используйте kotlin-test-junit или kotlin-test-testng для реализации соответствующего утверждения и сопоставления аннотаций.
  • Для целей Kotlin/JS добавьте kotlin-test-js как зависимость для тестов.

Для целей Kotlin/Native дополнительные зависимости для тестов не требуются, а реализации API kotlin.test встроены.

kotlin{
    sourceSets {
        commonTest {
            dependencies {
                implementation kotlin('test-common')
                implementation kotlin('test-annotations-common')
            }
        }
        jvmTest {
            dependencies {
                implementation kotlin('test-junit')
            }
        }
        jsTest {
            dependencies {
                implementation kotlin('test-js')
            }
        }
    }
}
kotlin{
    sourceSets {
        val commonTest by getting {
            dependencies {
                implementation(kotlin("test-common"))
                implementation(kotlin("test-annotations-common"))
            }
        }
        val jvmTest by getting {
            dependencies {
                implementation(kotlin("test-junit"))
            }
        }
        val jsTest by getting {
            dependencies {
                implementation(kotlin("test-js"))
            }
        }
    }
}

Вы можете использовать сокращения для зависимости от модуля Kotlin, например, kotlin("test") для "org.jetbrains.kotlin:kotlin-test".

Установите зависимость от библиотеки kotlinx

Если вы используете библиотеку kotlinx и вам нужна платформа-специфичная зависимость, вы можете использовать платформенно-специфические варианты библиотек с суффиксами, такими как -jvm или -js, например, kotlinx-coroutines-core-jvm . Вы также можете использовать имя базового артефакта библиотеки – kotlinx-coroutines-core.

kotlin {
    sourceSets {
        jvmMain {
            dependencies {
                implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.4.1'
            }
        }
    }
}
kotlin {
    sourceSets {
        val jvmMain by getting {
            dependencies {
                implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.4.1")
            }
        }
    }
}

Если вы используете многоплатформенную библиотеку и вам нужно зависеть от общего кода, установите зависимость только один раз в наборе исходных файлов для общего кода. Используйте имя базового артефакта библиотеки, такое как kotlinx-coroutines-core или ktor-client-core.

kotlin {
    sourceSets {
        commonMain {
            dependencies {
                implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1'
            }
        }
    }
}
kotlin {
    sourceSets {
        val commonMain by getting {
            dependencies {
                implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1")
            }
        }
    }
}

Установка зависимостей на верхнем уровне

В качестве альтернативы, вы можете указать зависимости на верхнем уровне с именами конфигураций, следуя шаблону <sourceSetName><DependencyType>. Это полезно для некоторых встроенных зависимостей Gradle, таких как gradleApi(), localGroovy(), или gradleTestKit(), которые недоступны в DSL зависимостей наборов исходных данных.

dependencies {
    commonMainImplementation 'com.example:my-library:1.0'
}

dependencies {
    "commonMainImplementation"("com.example:my-library:1.0")
}

Обработка аннотаций

Kotlin поддерживает обработку аннотаций с помощью инструмента Kotlin для обработки аннотаций kapt.

Инкрементная компиляция

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

Инкрементная компиляция поддерживается для проектов Kotlin/JVM и Kotlin/JS.

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

  • Добавьте следующую строку в файл gradle.properties или local.properties:
    • kotlin.incremental=<value> для Kotlin/JVM
    • kotlin.incremental.js=<value> для проектов Kotlin/JS.
      <value> — это булевое значение, отражающее использование инкрементной компиляции.
  • В качестве параметра командной строки используйте -Pkotlin.incremental или -Pkotlin.incremental.js с булевым значением, отражающим использование инкрементной компиляции.
    Обратите внимание, что в этом случае параметр должен добавляться к каждой последующей сборке, и любая сборка с отключенной инкрементной компиляцией делает недействительными кэши инкрементной компиляции.

Обратите внимание, что первая сборка в любом случае не является инкрементной.

Поддержка кэша сборки Gradle

Плагин Kotlin поддерживает кэш сборки Gradle.

Чтобы отключить кэширование для всех задач Kotlin, установите системную переменную kotlin.caching.enabled в значение false (запустите сборку с аргументом -Dkotlin.caching.enabled=false).

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

Параметры компилятора

Для указания дополнительных параметров компиляции используйте свойство kotlinOptions задачи компиляции Kotlin.

При нацеливании на JVM задачи называются compileKotlin для кода производства и compileTestKotlin для тестового кода. Задачи для пользовательских наборов исходных данных называются в соответствии с шаблоном compile<Name>Kotlin.

Имена задач в проектах Android содержат имена вариантов сборки build variant и следуют шаблону compile<BuildVariant>Kotlin, например, compileDebugKotlin, compileReleaseUnitTestKotlin.

При нацеливании на JavaScript задачи называются compileKotlinJs и compileTestKotlinJs соответственно, а compile<Name>KotlinJs для пользовательских наборов исходных данных.

Для настройки отдельной задачи используйте её имя. Примеры:

compileKotlin {
    kotlinOptions.suppressWarnings = true
}

//or

compileKotlin {
    kotlinOptions {
        suppressWarnings = true
    }
}
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
// ...

val compileKotlin: KotlinCompile by tasks

compileKotlin.kotlinOptions.suppressWarnings = true

Обратите внимание, что при использовании Gradle Kotlin DSL, вы должны получить задачу из tasks проекта сначала.

Используйте типы Kotlin2JsCompile и KotlinCompileCommon для целей JS и Common соответственно.

Также возможно настроить все задачи компиляции Kotlin в проекте:

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
    kotlinOptions { //... }
}
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

tasks.withType<KotlinCompile>().configureEach {
    kotlinOptions.suppressWarnings = true
}

Полный список параметров для задач Gradle следующий:

Атрибуты, общие для JVM, JS и JS DCE

Имя Описание Возможные значения Значение по умолчанию
allWarningsAsErrors Сообщить об ошибке, если есть предупреждения false
suppressWarnings Не генерировать предупреждения false
verbose Включить подробный вывод логов false
freeCompilerArgs Список дополнительных аргументов компилятора []

Атрибуты, общие для JVM и JS

Имя Описание Возможные значения Значение по умолчанию
apiVersion Разрешить использование только объявлений из указанной версии связанных библиотек "1.2" (УСТАРЕЛО), "1.3", "1.4", "1.5" (ЭКСПЕРИМЕНТАЛЬНО)
languageVersion Обеспечить обратную совместимость со специфицированной версией Kotlin "1.2" (УСТАРЕЛО), "1.3", "1.4", "1.5" (ЭКСПЕРИМЕНТАЛЬНО)

Атрибуты, специфичные для JVM

Имя Описание Возможные значения Значение по умолчанию
javaParameters Генерировать метаданные для Java 1.8 рефлексии над параметрами метода false
jdkHome Включить пользовательскую JDK из указанного места в пути к классам вместо значения по умолчанию JAVA_HOME
jvmTarget Целевая версия сгенерированного JVM байткода "1.6", "1.8", "9", "10", "11", "12", "13", "14" "1.6"
noJdk Не включать автоматически Java runtime в путь к классам false
noReflect Не включать автоматически Kotlin рефлексию в путь к классам true
noStdlib Не включать автоматически Kotlin/JVM stdlib и Kotlin рефлексию в путь к классам true
useIR Использовать IR бэкенд false

Атрибуты, специфичные для JS

Имя Описание Возможные значения Значение по умолчанию
friendModulesDisabled Отключить экспорт внутренней декларации false
main Определить, должна ли вызываться функция main при выполнении "call", "noCall" "call"
metaInfo Генерировать файлы .meta.js и .kjsm с метаданными. Используется для создания библиотеки true
moduleKind Тип модуля JS, сгенерированного компилятором "umd", "commonjs", "amd", "plain" "umd"
noStdlib Не включать автоматически стандартную библиотеку Kotlin/JS в зависимости компиляции true
outputFile Целевой файл *.js для результата компиляции "<buildDir>/js/packages/<project.name>/kotlin/<project.name>.js"
sourceMap Генерировать карту исходного кода true
sourceMapEmbedSources Встраивать исходные файлы в карту исходного кода "never", "always", "inlining"
sourceMapPrefix Добавить указанный префикс к путям в карте исходного кода
target Генерировать файлы JS для определённой версии ECMA "v5" "v5"
typedArrays Преобразовать примитивные массивы в типизированные массивы JS true

Генерация документации

Для генерации документации для проектов Kotlin используйте Dokka; обратитесь к Руководству Dokka за инструкциями по конфигурации. Dokka поддерживает проекты с несколькими языками и может генерировать вывод в различных форматах, включая стандартный JavaDoc.

OSGi

Для поддержки OSGi см. страницу Kotlin OSGi.

Использование Gradle Kotlin DSL

При использовании Gradle Kotlin DSL, применяйте Kotlin плагины используя блок plugins { ... }. Если вы применяете их с помощью apply { plugin(...) } вместо этого, вы можете столкнуться с неразрешенными ссылками на расширения, сгенерированные Gradle Kotlin DSL. Для решения этой проблемы можно прокомментировать ошибочные использования, выполнить задачу Gradle kotlinDslAccessorsSnapshot, затем снова разкомментировать использования и перезапустить сборку или повторно импортировать проект в IDE.

© 2010–2020 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/reference/using-gradle.html

Spec-Zone.ru

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