Переход на плагин Dokka Gradle v2
Плагин Dokka Gradle (DGP) — это инструмент для создания полной документации API проектов Kotlin, собираемых с помощью Gradle.
DGP обрабатывает комментарии KDoc в Kotlin и комментарии Javadoc в Java, извлекая из них информацию и создавая структурированную документацию в формате HTML или Javadoc.
Режим Dokka Gradle plugin v2 включен по умолчанию и соответствует рекомендациям Gradle:
Использует типы Gradle, что повышает производительность.
Использует понятную конфигурацию DSL верхнего уровня вместо низкоуровневой настройки на основе задач, что упрощает скрипты сборки и делает их более читаемыми.
Использует более декларативный подход к агрегации документации, упрощая управление документацией в проектах с несколькими модулями.
Использует типобезопасную конфигурацию плагина, повышая надежность и удобство сопровождения скриптов сборки.
Полностью поддерживает кэш конфигурации и кэш сборки Gradle, что повышает производительность и упрощает работу со сборками.
В этом руководстве приведены дополнительные сведения об изменениях и переходе с режимов DGP v1 на v2.
Перед началом работы
Перед началом миграции выполните следующие действия.
Проверьте поддерживаемые версии
Убедитесь, что ваш проект соответствует минимальным требованиям к версиям:
Инструмент |
Версия |
|---|---|
7.6 или выше |
|
7.0 или выше |
|
1.9 или выше |
Включите DGP v2
Обновите версию Dokka до 2.2.0 в блоке plugins {} файла build.gradle.kts вашего проекта:
plugins {
kotlin("jvm") version "2.1.10"
id("org.jetbrains.dokka") version "2.2.0"
}
Кроме того, для включения плагина Dokka Gradle v2 можно использовать каталог версий.
Включите помощники миграции
В файле gradle.properties проекта задайте следующее свойство Gradle, чтобы активировать DGP v2 с помощниками:
org.jetbrains.dokka.experimental.gradle.pluginMode=V2EnabledWithHelpers
Это свойство активирует плагин DGP v2 с помощниками миграции. Эти помощники предотвращают ошибки компиляции, если в скриптах сборки есть ссылки на задачи из DGP v1, которые больше недоступны в DGP v2.
После завершения миграции отключите помощники миграции.
Синхронизируйте проект с Gradle
После включения DGP v2 и помощников миграции синхронизируйте проект с Gradle, чтобы убедиться, что DGP v2 применен правильно:
Если вы используете IntelliJ IDEA, нажмите кнопку Перезагрузить все проекты Gradle
в окне инструмента Gradle.
Если вы используете Android Studio, выберите Файл | Синхронизировать проект с файлами Gradle.
Перенесите проект
После обновления плагина Dokka Gradle до v2 выполните действия по миграции, применимые к вашему проекту.
Настройте параметры конфигурации
В DGP v2 изменены некоторые параметры конфигурации Gradle. В файле build.gradle.kts настройте параметры конфигурации в соответствии с конфигурацией вашего проекта.
Конфигурация DSL верхнего уровня в DGP v2
Замените синтаксис конфигурации DGP v1 на конфигурацию DSL dokka {} верхнего уровня в DGP v2:
Конфигурация в DGP v1:
tasks.withType<DokkaTask>().configureEach {
suppressInheritedMembers.set(true)
failOnWarning.set(true)
dokkaSourceSets {
named("main") {
moduleName.set("Project Name")
includes.from("README.md")
sourceLink {
localDirectory.set(file("src/main/kotlin"))
remoteUrl.set(URL("https://example.com/src"))
remoteLineSuffix.set("#L")
}
}
}
}
tasks.dokkaHtml {
pluginConfiguration<DokkaBase, DokkaBaseConfiguration> {
customStyleSheets.set(listOf("styles.css"))
customAssets.set(listOf("logo.png"))
footerMessage.set("(c) Your Company")
}
}
Конфигурация в DGP v2:
Синтаксис файлов build.gradle.kts отличается от синтаксиса обычных файлов .kt (например, используемых для пользовательских плагинов Gradle), поскольку Kotlin DSL в Gradle использует типобезопасные аксессоры.
// build.gradle.kts
dokka {
moduleName.set("Project Name")
dokkaPublications.html {
suppressInheritedMembers.set(true)
failOnWarning.set(true)
}
dokkaSourceSets.main {
includes.from("README.md")
sourceLink {
localDirectory.set(file("src/main/kotlin"))
remoteUrl("https://example.com/src")
remoteLineSuffix.set("#L")
}
}
pluginsConfiguration.html {
customStyleSheets.from("styles.css")
customAssets.from("logo.png")
footerMessage.set("(c) Your Company")
}
}
// CustomPlugin.kt
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.jetbrains.dokka.gradle.DokkaExtension
import org.jetbrains.dokka.gradle.engine.plugins.DokkaHtmlPluginParameters
abstract class CustomPlugin : Plugin<Project> {
override fun apply(project: Project) {
project.plugins.apply("org.jetbrains.dokka")
project.extensions.configure(DokkaExtension::class.java) { dokka ->
dokka.dokkaPublications.named("html") { publication ->
publication.suppressInheritedMembers.set(true)
publication.failOnWarning.set(true)
}
dokka.dokkaSourceSets.named("main") { dss ->
dss.includes.from("README.md")
dss.sourceLink {
it.localDirectory.set(project.file("src/main/kotlin"))
it.remoteUrl("https://example.com/src")
it.remoteLineSuffix.set("#L")
}
}
dokka.pluginsConfiguration.named("html", DokkaHtmlPluginParameters::class.java) { html ->
html.customStyleSheets.from("styles.css")
html.customAssets.from("logo.png")
html.footerMessage.set("(c) Your Company")
}
}
}
}
Настройки видимости
Задайте для свойства documentedVisibilities значение VisibilityModifier.Public вместо Visibility.PUBLIC.
Конфигурация в DGP v1:
import org.jetbrains.dokka.DokkaConfiguration.Visibility
// ...
documentedVisibilities.set(
setOf(Visibility.PUBLIC)
)
Конфигурация в DGP v2:
import org.jetbrains.dokka.gradle.engine.parameters.VisibilityModifier
// ...
documentedVisibilities.set(
setOf(VisibilityModifier.Public)
)
// OR
documentedVisibilities(VisibilityModifier.Public)
Кроме того, используйте вспомогательную функцию DGP v2 для добавления документируемых уровней видимости:
fun documentedVisibilities(vararg visibilities: VisibilityModifier): Unit =
documentedVisibilities.set(visibilities.asList())
Ссылки на исходный код
Настройте ссылки на исходный код, чтобы из созданной документации можно было перейти к соответствующему исходному коду в удаленном репозитории. Для этой конфигурации используйте блок dokkaSourceSets.main{}.
Конфигурация в DGP v1:
tasks.withType<DokkaTask>().configureEach {
dokkaSourceSets {
named("main") {
sourceLink {
localDirectory.set(file("src/main/kotlin"))
remoteUrl.set(URL("https://github.com/your-repo"))
remoteLineSuffix.set("#L")
}
}
}
}
Конфигурация в DGP v2:
Синтаксис файлов build.gradle.kts отличается от синтаксиса обычных файлов .kt (например, используемых для пользовательских плагинов Gradle), поскольку Kotlin DSL в Gradle использует типобезопасные аксессоры.
// build.gradle.kts
dokka {
dokkaSourceSets.main {
sourceLink {
localDirectory.set(file("src/main/kotlin"))
remoteUrl("https://github.com/your-repo")
remoteLineSuffix.set("#L")
}
}
}
// CustomPlugin.kt
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.jetbrains.dokka.gradle.DokkaExtension
abstract class CustomPlugin : Plugin<Project> {
override fun apply(project: Project) {
project.plugins.apply("org.jetbrains.dokka")
project.extensions.configure(DokkaExtension::class.java) { dokka ->
dokka.dokkaSourceSets.named("main") { dss ->
dss.includes.from("README.md")
dss.sourceLink {
it.localDirectory.set(project.file("src/main/kotlin"))
it.remoteUrl("https://example.com/src")
it.remoteLineSuffix.set("#L")
}
}
}
}
}
Поскольку конфигурация ссылки на исходный код изменилась, используйте класс URI вместо URL, чтобы указать URL-адрес удаленного репозитория.
Конфигурация в DGP v1:
remoteUrl.set(URL("https://github.com/your-repo"))
Конфигурация в DGP v2:
remoteUrl.set(URI("https://github.com/your-repo"))
// or
remoteUrl("https://github.com/your-repo")
Кроме того, в DGP v2 есть две вспомогательные функции для задания URL-адреса:
fun remoteUrl(@Language("http-url-reference") value: String): Unit =
remoteUrl.set(URI(value))
// and
fun remoteUrl(value: Provider<String>): Unit =
remoteUrl.set(value.map(::URI))
Ссылки на внешнюю документацию
Регистрируйте ссылки на внешнюю документацию с помощью метода register(), задавая каждую ссылку отдельно. API externalDocumentationLinks использует этот метод в соответствии с соглашениями DSL Gradle.
Конфигурация в DGP v1:
tasks.dokkaHtml {
dokkaSourceSets {
configureEach {
externalDocumentationLink {
url = URL("https://example.com/docs/")
packageListUrl = File("/path/to/package-list").toURI().toURL()
}
}
}
}
Конфигурация в DGP v2:
dokka {
dokkaSourceSets.configureEach {
externalDocumentationLinks.register("example-docs") {
url("https://example.com/docs/")
packageListUrl("https://example.com/docs/package-list")
}
}
}
Пользовательские ресурсы
Используйте свойство customAssets с коллекциями файлов (FileCollection) вместо списков (var List<File>).
Конфигурация в DGP v1:
customAssets = listOf(file("example.png"), file("example2.png"))
Конфигурация в DGP v2:
customAssets.from("example.png", "example2.png")
Выходной каталог
Укажите выходной каталог для созданной документации Dokka в блоке dokka {}.
Конфигурация в DGP v1:
tasks.dokkaHtml {
outputDirectory.set(layout.buildDirectory.dir("dokkaDir"))
}
Конфигурация в DGP v2:
dokka {
dokkaPublications.html {
outputDirectory.set(layout.buildDirectory.dir("dokkaDir"))
}
}
Выходной каталог для дополнительных файлов
Укажите выходной каталог и дополнительные файлы для проектов с одним и несколькими модулями в блоке dokka {}.
В DGP v2 конфигурация проектов с одним и несколькими модулями унифицирована. Вместо отдельной настройки задач dokkaHtml и dokkaHtmlMultiModule укажите параметры в dokkaPublications.html {} внутри блока dokka {}.
Для проектов с несколькими модулями задайте выходной каталог и дополнительные файлы (например, README.md) в конфигурации корневого проекта.
Конфигурация в DGP v1:
tasks.dokkaHtmlMultiModule {
outputDirectory.set(rootDir.resolve("docs/api/0.x"))
includes.from(project.layout.projectDirectory.file("README.md"))
}
Конфигурация в DGP v2:
Синтаксис файлов build.gradle.kts отличается от синтаксиса обычных файлов .kt (например, используемых для пользовательских плагинов Gradle), поскольку Kotlin DSL в Gradle использует типобезопасные аксессоры.
// build.gradle.kts
dokka {
dokkaPublications.html {
outputDirectory.set(rootDir.resolve("docs/api/0.x"))
includes.from(project.layout.projectDirectory.file("README.md"))
}
}
// CustomPlugin.kt
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.jetbrains.dokka.gradle.DokkaExtension
abstract class CustomPlugin : Plugin<Project> {
override fun apply(project: Project) {
project.plugins.apply("org.jetbrains.dokka")
project.extensions.configure(DokkaExtension::class.java) { dokka ->
dokka.dokkaPublications.named("html") { html ->
html.outputDirectory.set(project.rootDir.resolve("docs/api/0.x"))
html.includes.from(project.layout.projectDirectory.file("README.md"))
}
}
}
}
Настройте плагины Dokka
Настройка встроенных плагинов Dokka с помощью JSON устарела и заменена типобезопасным DSL. Это изменение улучшает совместимость с системой инкрементальной сборки Gradle и отслеживание входных данных задач.
Конфигурация в DGP v1:
В DGP v1 плагины Dokka настраивались вручную с помощью JSON. Такой подход вызывал проблемы с регистрацией входных данных задач для проверок актуальности в Gradle.
Ниже приведен пример устаревшей конфигурации на основе JSON для плагина управления версиями Dokka:
tasks.dokkaHtmlMultiModule {
pluginsMapConfiguration.set(
mapOf(
"org.jetbrains.dokka.versioning.VersioningPlugin" to """
{ "version": "1.2", "olderVersionsDir": "$projectDir/dokka-docs" }
""".trimIndent()
)
)
}
Конфигурация в DGP v2:
В DGP v2 плагины Dokka настраиваются с помощью типобезопасного DSL. Чтобы настроить плагины Dokka типобезопасным способом, используйте блок pluginsConfiguration{}:
dokka {
pluginsConfiguration {
versioning {
version.set("1.2")
olderVersionsDir.set(projectDir.resolve("dokka-docs"))
}
}
}
Пример конфигурации DGP v2 см. в разделе плагин управления версиями Dokka.
DGP v2 позволяет расширять свои возможности, настраивая пользовательские плагины. Пользовательские плагины позволяют выполнять дополнительную обработку или изменять процесс создания документации.
Общий доступ к конфигурации Dokka для подпроектов
В DPG v2 больше не используются subprojects {} или allprojects {} для предоставления общего доступа к конфигурации подпроектов. В будущих версиях Gradle использование этих подходов приведет к ошибкам.
Выполните следующие действия, чтобы правильно предоставить общий доступ к конфигурации Dokka в проектах с несколькими модулями с существующими плагинами соглашений или без плагинов соглашений.
После предоставления общего доступа к конфигурации Dokka можно объединить документацию нескольких подпроектов в один результат. Дополнительные сведения см. в разделе Обновление агрегации документации в проектах с несколькими модулями.
Проекты с несколькими модулями без плагинов соглашений
Если в проекте не используются плагины соглашений, конфигурации Dokka все равно можно использовать совместно, настраивая каждый подпроект напрямую. Для этого нужно вручную задать общую конфигурацию в файле build.gradle.kts каждого подпроекта. Этот подход менее централизован, но позволяет избежать необходимости в дополнительной настройке, например в создании плагинов соглашений.
Если же в проекте используются плагины соглашений, конфигурацию Dokka в проектах с несколькими модулями также можно использовать совместно: создайте плагин соглашений в каталоге buildSrc, а затем примените его к подпроектам.
Настройте каталог buildSrc
-
В корне проекта создайте каталог
buildSrc, содержащий два файла:settings.gradle.ktsbuild.gradle.kts
-
Добавьте следующий фрагмент в файл
buildSrc/settings.gradle.kts:rootProject.name = "buildSrc"
-
Добавьте следующий фрагмент в файл
buildSrc/build.gradle.kts:plugins { `kotlin-dsl` } repositories { mavenCentral() gradlePluginPortal() } dependencies { implementation("org.jetbrains.dokka:dokka-gradle-plugin:2.2.0") }
Настройте плагин соглашений Dokka
После настройки каталога buildSrc:
Создайте файл
buildSrc/src/main/kotlin/dokka-convention.gradle.ktsдля размещения плагина соглашений.-
Добавьте следующий фрагмент в файл
dokka-convention.gradle.kts:plugins { id("org.jetbrains.dokka") } dokka { // The shared configuration goes here }Добавьте общую для всех подпроектов конфигурацию Dokka в блок
dokka {}. Указывать версию Dokka не нужно: она уже задана в файлеbuildSrc/build.gradle.kts.
Примените плагин соглашений к подпроектам
Примените плагин соглашений Dokka ко всем подпроектам, добавив его в файл build.gradle.kts каждого подпроекта:
plugins {
id("dokka-convention")
}
Проекты с несколькими модулями и плагинами соглашений
Если вы уже используете плагины соглашений, создайте отдельный плагин соглашений Dokka, следуя документации Gradle.
Затем выполните действия, чтобы настроить плагин соглашений Dokka и применить его ко всем подпроектам.
Обновите агрегацию документации в проектах с несколькими модулями
Dokka может объединять документацию нескольких подпроектов в один результат или публикацию.
Как объяснялось ранее, перед агрегацией документации примените плагин Dokka ко всем подпроектам, для которых создается документация.
В DGP v2 для агрегации используется блок dependencies {} вместо задач; его можно добавить в любой файл build.gradle.kts.
В DGP v1 агрегация неявно создавалась в корневом проекте. Чтобы воспроизвести это поведение в DGP v2, добавьте блок dependencies {} в файл build.gradle.kts корневого проекта.
Агрегация в DGP v1:
tasks.dokkaHtmlMultiModule {
// ...
}
Агрегация в DGP v2:
dependencies {
dokka(project(":some-subproject:"))
dokka(project(":another-subproject:"))
}
Измените каталог агрегированной документации
При агрегации подпроектов с помощью DGP каждый подпроект размещается в собственном подкаталоге агрегированной документации.
В DGP v2 механизм агрегации обновлен для лучшего соответствия соглашениям Gradle. Теперь DGP v2 сохраняет полный путь к каталогу подпроекта, чтобы избежать конфликтов при агрегации документации в любом месте.
Каталог агрегации в DGP v1:
В DGP v1 агрегированная документация помещалась в каталог с упрощенной структурой. Например, если в проекте агрегация выполняется в :turbo-lib и есть вложенный подпроект :turbo-lib:maths, созданная документация помещалась по следующему пути:
turbo-lib/build/dokka/html/maths/
Каталог агрегации в DGP v2:
DGP v2 сохраняет полную структуру проекта, обеспечивая уникальный каталог для каждого подпроекта. Теперь та же агрегированная документация имеет следующую структуру:
turbo-lib/build/dokka/html/turbo-lib/maths/
Это изменение предотвращает конфликты между подпроектами с одинаковыми именами. Однако из-за изменения структуры каталогов внешние ссылки могут устареть, что может привести к ошибкам 404.
Вернитесь к структуре каталогов DGP v1
Если проект зависит от структуры каталогов, используемой в DGP v1, можно вернуть это поведение, указав каталог подпроекта вручную. Добавьте следующую конфигурацию в файл build.gradle.kts каждого подпроекта:
// /turbo-lib/maths/build.gradle.kts
plugins {
id("org.jetbrains.dokka")
}
dokka {
// Overrides the subproject directory to match the V1 structure
modulePath.set("maths")
}
Создайте документацию с помощью обновленной задачи
В DGP v2 переименованы задачи Gradle, создающие документацию API.
Задача в DGP v1:
./gradlew dokkaHtml // or ./gradlew dokkaHtmlMultiModule
Задача в DGP v2:
./gradlew :dokkaGenerate
Задача dokkaGenerate создает документацию API в каталоге build/dokka/.
В DGP v2 задача dokkaGenerate работает как для проектов с одним модулем, так и для проектов с несколькими модулями. Для создания вывода в формате HTML, Javadoc или одновременно в обоих форматах можно использовать разные задачи. Дополнительные сведения см. в разделе Выбор формата вывода документации.
Выберите формат вывода документации
Формат вывода DGP v2 по умолчанию — HTML. Однако можно выбрать создание документации API в формате HTML, Javadoc или одновременно в обоих форматах:
-
Поместите соответствующий плагин
idв блокplugins {}файлаbuild.gradle.ktsпроекта:plugins { // Generates HTML documentation id("org.jetbrains.dokka") version "2.2.0" // Generates Javadoc documentation id("org.jetbrains.dokka-javadoc") version "2.2.0" // Keeping both plugin IDs generates both formats } Запустите соответствующую задачу Gradle.
Ниже приведен список плагинов id и задач Gradle для каждого формата:
HTML |
Javadoc |
Оба формата |
|
|---|---|---|---|
Плагин |
|
|
Используйте плагины HTML и Javadoc |
Задача Gradle |
|
|
|
Если вы используете IntelliJ IDEA, может отображаться задача Gradle dokkaGenerateHtml. Эта задача является псевдонимом задачи dokkaGeneratePublicationHtml. Обе задачи выполняют совершенно одинаковую операцию.
Учитывайте устаревшие и удаленные возможности
Поддержка форматов вывода: DGP v2 поддерживает только форматы вывода HTML и Javadoc. Экспериментальные форматы, такие как Markdown и Jekyll, больше не поддерживаются.
Задача-сборщик: задача
DokkaCollectorTaskудалена. Теперь нужно отдельно создавать документацию для каждого подпроекта, а затем при необходимости агрегировать документацию.
Завершение миграции
После миграции проекта выполните следующие действия, чтобы завершить процесс и повысить производительность.
Установите флаг opt-in
После успешной миграции установите следующий флаг opt-in без вспомогательных средств в файле проекта gradle.properties:
org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled
Если вы удалили ссылки на задачи Gradle из DGP v1, которые больше недоступны в DGP v2, ошибок компиляции, связанных с этим, возникнуть не должно.
Включите кэш сборки и кэш конфигурации
Теперь DGP v2 поддерживает кэш сборки и кэш конфигурации Gradle, что повышает производительность сборки.
Чтобы включить кэш сборки, следуйте инструкциям в документации по кэшу сборки Gradle.
Чтобы включить кэш конфигурации, следуйте инструкциям в документации по кэшу конфигурации Gradle.
Что дальше
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/dokka-migration.html