Dokka Gradle 구성 옵션
Dokka Gradle 구성 옵션 (Dokka Gradle configuration options)
Dokka에는 나와 독자의 경험을 맞춤 설정할 수 있는 구성 옵션이 많아요.
아래에는 각 구성 섹션에 대한 상세 설명과 몇 가지 예시가 있어요. 모든 구성 옵션을 적용한 예시도 찾아볼 수 있어요.
단일 프로젝트 및 멀티 프로젝트 빌드에 구성 블록을 적용하는 방법에 대한 자세한 내용은 Configuration 예시를 참고하세요.
본문
일반 구성 (General configuration)
Dokka Gradle 플러그인의 일반 구성 예시예요.
- 최상위
dokka {}DSL 구성을 사용해요. - DGP에서는
dokkaPublications{}블록에 Dokka 발행(publish) 구성을 선언해요. - 기본 발행은
htmlhtml과javadocjavadoc이에요. build.gradle.kts파일의 문법은 Gradle의 Kotlin DSL이 타입 안전 접근자(type-safe accessor)를 사용하기 때문에 일반.kt파일(예: Kotlin 커스텀 플러그인용)과 달라요.
plugins {
id("org.jetbrains.dokka") version "2.2.0"
}
dokka {
dokkaPublications.html {
moduleName.set(project.name)
moduleVersion.set(project.version.toString())
// Standard output directory for HTML documentation
outputDirectory.set(layout.buildDirectory.dir("dokka/html"))
failOnWarning.set(false)
suppressInheritedMembers.set(false)
suppressObviousFunctions.set(true)
offlineMode.set(false)
includes.from("packages.md", "extra.md")
// Output directory for additional files
// Use this block instead of the standard when you
// want to change the output directory and include extra files
outputDirectory.set(rootDir.resolve("docs/api/0.x"))
// Use fileTree to add multiple files
includes.from(
fileTree("docs") {
include("**/*.md")
}
)
}
}
파일 다루기에 대한 자세한 내용은 Gradle 문서를 참고하세요.
// 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.moduleName.set(project.name)
dokka.moduleVersion.set(project.version.toString())
dokka.dokkaPublications.named("html") { publication ->
// Standard output directory for HTML documentation
publication.outputDirectory.set(project.layout.buildDirectory.dir("dokka/html"))
publication.failOnWarning.set(true)
publication.suppressInheritedMembers.set(true)
publication.offlineMode.set(false)
publication.suppressObviousFunctions.set(true)
publication.includes.from("packages.md", "extra.md")
// Output directory for additional files
// Use this instead of the standard block when you
// want to change the output directory and include extra files
html.outputDirectory.set(project.rootDir.resolve("docs/api/0.x"))
}
}
}
}
plugins {
id 'org.jetbrains.dokka' version '2.2.0'
}
dokka {
dokkaPublications {
html {
// Sets general module information
moduleName.set(project.name)
moduleVersion.set(project.version.toString())
// Standard output directory for HTML documentation
outputDirectory.set(layout.buildDirectory.dir("dokka/html"))
// Core Dokka options
failOnWarning.set(false)
suppressInheritedMembers.set(false)
suppressObviousFunctions.set(true)
offlineMode.set(false)
includes.from(files("packages.md", "extra.md"))
// Output directory for additional files
// Use this block instead of the standard when you want to
// change the output directory and include extra files
outputDirectory.set(file("$rootDir/docs/api/0.x"))
}
}
}
moduleName — 프로젝트 문서의 표시 이름이에요. 목차, 내비게이션, 헤더, 로그 메시지에 나타나요. 멀티 프로젝트 빌드에서는 각 하위 프로젝트의 moduleName이 집계된 문서에서 해당 섹션 제목으로 사용돼요.
기본값: Gradle 프로젝트 이름
moduleVersion — 생성된 문서에 표시되는 하위 프로젝트 버전이에요. 단일 프로젝트 빌드에서는 프로젝트 버전으로 사용돼요. 멀티 프로젝트 빌드에서는 문서를 집계할 때 각 하위 프로젝트의 moduleVersion이 사용돼요.
기본값: Gradle 프로젝트 버전
outputDirectory — 생성된 문서가 저장되는 디렉터리예요. 이 설정은 dokkaGenerate 태스크가 생성하는 모든 문서 형식(HTML, Javadoc 등)에 적용돼요.
기본값: build/dokka/html
추가 파일의 출력 디렉터리 (Output directory for additional files)
단일 및 멀티 프로젝트 빌드 모두에서 출력 디렉터리를 지정하고 추가 파일을 포함할 수 있어요. 멀티 프로젝트 빌드에서는 루트 프로젝트의 구성에서 출력 디렉터리를 설정하고 추가 파일을 포함해요.
failOnWarning — 문서 생성 중 경고가 발생했을 때 Dokka가 빌드를 실패시킬지 여부예요. 프로세스는 먼저 모든 오류와 경고가 출력될 때까지 기다려요. 이 설정은 reportUndocumented와 잘 어울려요.
기본값: false
suppressInheritedMembers — 주어진 클래스에서 명시적으로 오버라이드되지 않은 상속된 멤버를 숨길지 여부예요. 참고: 이 옵션은 equals, hashCode, toString 같은 함수는 숨기지만, dataClass.componentN이나 dataClass.copy 같은 합성 함수는 숨기지 않아요. 그런 함수는 suppressObviousFunctions를 사용하세요.
기본값: false
suppressObviousFunctions — 명백한 함수를 숨길지 여부예요. 다음에 해당하면 함수가 명백한 것으로 간주돼요.
kotlin.Any,Kotlin.Enum,java.lang.Object또는java.lang.Enum에서 상속된 함수(예:equals,hashCode,toString).- 컴파일러가 만든 합성(synthetic) 함수로 문서가 없는 것(예:
dataClass.componentN또는dataClass.copy).
기본값: true
offlineMode — 네트워크로 원격 파일과 링크를 조회할지 여부예요. 여기에는 외부 문서에 대한 링크를 생성하는 데 쓰는 package-list가 포함돼요. 예를 들어 표준 라이브러리의 클래스를 문서에서 클릭 가능하게 만들 수 있죠. 이 값을 true로 설정하면 특정 경우에 빌드 시간을 크게 단축할 수 있지만, 표준 라이브러리를 포함한 의존성에서 나온 클래스/멤버 링크를 조회하지 않게 되어 사용자 경험이 나빠질 수 있어요.
참고: 가져온 파일을 로컬에 캐시해서 Dokka에 로컬 경로로 제공할 수 있어요. externalDocumentationLinksexternalDocumentationLinks 섹션을 참고하세요.
기본값: false
includes — 하위 프로젝트 및 패키지 문서가 들어 있는 Markdown 파일 목록이에요. Markdown 파일은 필요한 형식과 일치해야 해요. 지정된 파일의 내용은 파싱되어 하위 프로젝트 및 패키지 설명으로 문서에 포함돼요.
예시와 사용 방법은 Dokka Gradle 예시를 참고하세요.
Source set 구성 (Source set configuration)
Dokka는 Kotlin source set에 대해 일부 옵션을 구성할 수 있게 해줘요.
import org.jetbrains.dokka.gradle.engine.parameters.VisibilityModifier
dokka {
// ..
// General configuration section
// ..
// Source sets configuration
dokkaSourceSets {
// Example: Configuration exclusive to the 'linux' source set
named("linux") {
dependentSourceSets{named("native")}
sourceRoots.from(file("linux/src"))
}
configureEach {
suppress.set(false)
displayName.set(name)
documentedVisibilities.set(setOf(VisibilityModifier.Public)) // OR documentedVisibilities(VisibilityModifier.Public)
reportUndocumented.set(false)
skipEmptyPackages.set(true)
skipDeprecated.set(false)
suppressGeneratedFiles.set(true)
jdkVersion.set(8)
languageVersion.set("1.7")
apiVersion.set("1.7")
sourceRoots.from(file("src"))
classpath.from(file("libs/dependency.jar"))
samples.from("samples/Basic.kt", "samples/Advanced.kt")
sourceLink {
// Source link section
}
perPackageOption {
// Package options section
}
externalDocumentationLinks {
// External documentation links section
}
}
}
}
import org.jetbrains.dokka.gradle.engine.parameters.VisibilityModifier
dokka {
// ..
// General configuration section
// ..
dokkaSourceSets {
// Example: Configuration exclusive to the 'linux' source set
named("linux") {
dependentSourceSets { named("native") }
sourceRoots.from(file("linux/src"))
}
configureEach {
suppress.set(false)
displayName.set(name)
documentedVisibilities.set([VisibilityModifier.Public] as Set) // OR documentedVisibilities(VisibilityModifier.Public)
reportUndocumented.set(false)
skipEmptyPackages.set(true)
skipDeprecated.set(false)
suppressGeneratedFiles.set(true)
jdkVersion.set(8)
languageVersion.set("1.7")
apiVersion.set("1.7")
sourceRoots.from(file("src"))
classpath.from(file("libs/dependency.jar"))
samples.from("samples/Basic.kt", "samples/Advanced.kt")
sourceLink {
// Source link section
}
perPackageOption {
// Package options section
}
externalDocumentationLinks {
// External documentation links section
}
}
}
}
suppress — 문서 생성 시 이 source set을 건너뛸지 여부예요.
기본값: false
displayName — 이 source set을 가리키는 표시 이름이에요. 이 이름은 외부적으로(예: 문서 독자에게 보이는 source set 이름) 그리고 내부적으로(예: reportUndocumented의 로깅 메시지) 모두 사용돼요. 기본적으로 이 값은 Kotlin Gradle 플러그인이 제공하는 정보에서 추론돼요.
documentedVisibilities — Dokka가 생성된 문서에 포함해야 하는 가시성 수정자를 정의해요. protected, internal, private 선언을 문서화하고 싶거나, public 선언을 제외하고 내부 API만 문서화하고 싶을 때 사용해요. 추가로 Dokka의 documentedVisibilities()documentedVisibilities() 함수를 사용해 문서화할 가시성을 추가할 수도 있어요. 이 설정은 각 패키지별로 구성할 수 있어요.
기본값: VisibilityModifier.Public
reportUndocumented — documentedVisibilities와 다른 필터를 적용한 뒤에도 보이는, 즉 KDoc이 없는 문서화되지 않은 선언에 대한 경고를 낼지 여부예요. 이 설정은 failOnWarning과 잘 어울려요. 각 패키지별로 구성할 수 있어요.
기본값: false
skipEmptyPackages — 각종 필터를 적용한 뒤에도 보이는 선언이 없는 패키지를 건너뛸지 여부예요. 예를 들어 skipDeprecated가 true로 설정되어 있고 패키지에 deprecated 선언만 있다면, 그 패키지는 비어 있는 것으로 간주돼요.
기본값: true
skipDeprecated — @Deprecated로 어노테이션된 선언을 문서화할지 여부예요. 각 패키지별로 구성할 수 있어요.
기본값: false
suppressGeneratedFiles — 생성된 파일을 문서화할지 여부예요. 생성된 파일은 {project}/{buildDir}/generated 디렉터리 아래에 있을 것으로 예상돼요. true로 설정하면 그 디렉터리의 모든 파일이 사실상 suppressedFiles 옵션에 추가되므로, 수동으로 구성할 수 있어요.
기본값: true
suppressAnnotatedWith — 특정 어노테이션으로 표시된 선언을 숨기기 위한 어노테이션 FQN(완전한 이름) 집합이에요. 이 중 하나의 어노테이션으로 표시된 선언은 생성된 문서에서 제외돼요.
jdkVersion — Java 타입용 외부 문서 링크를 생성할 때 쓸 JDK 버전이에요. 예를 들어 어떤 공개 선언 시그니처에서 java.util.UUID를 사용하고 이 옵션이 8로 설정되어 있다면, Dokka는 그 타입에 대해 JDK 8 Javadocs로의 외부 문서 링크를 생성해요.
기본값: 8
languageVersion — 분석 및 @sample 환경을 설정하는 데 쓰는 Kotlin 언어 버전이에요. 기본적으로 Dokka에 내장된 컴파일러가 사용할 수 있는 최신 언어 버전이 사용돼요.
apiVersion — 분석 및 @sample 환경을 설정하는 데 쓰는 Kotlin API 버전이에요. 기본적으로 languageVersion에서 추론돼요.
sourceRoots — 분석하고 문서화할 소스코드 루트예요. 디렉터리와 개별 .kt 및 .java 파일을 입력으로 받아요. 기본적으로 source root는 Kotlin Gradle 플러그인이 제공하는 정보에서 추론돼요.
classpath — 분석 및 인터랙티브 샘플용 클래스패스예요. 의존성에서 온 일부 타입이 자동으로 해석/포착되지 않을 때 유용해요. 이 옵션은 .jar와 .klib 파일을 모두 받아요. 기본적으로 클래스패스는 Kotlin Gradle 플러그인이 제공하는 정보에서 추론돼요.
samples — @sample KDoc 태그로 참조되는 샘플 함수가 들어 있는 디렉터리 또는 파일 목록이에요.
Source link 구성 (Source link configuration)
독자들이 원격 저장소에 있는 각 선언의 소스를 찾을 수 있도록 source link를 구성해요. 이 구성에는 dokkaSourceSets.main {} 블록을 사용해요.
sourceLinks {} 구성 블록을 사용하면 각 시그니처에, 특정 줄 번호가 붙은 remoteUrl로 이어지는 source 링크를 추가할 수 있어요. 줄 번호는 remoteLineSuffix를 설정해 구성할 수 있어요.
예시는 kotlinx.coroutines의 count()count() 함수 문서를 참고하세요.
build.gradle.kts 파일의 문법은 Gradle의 Kotlin DSL이 타입 안전 접근자를 사용하기 때문에 일반 .kt 파일(예: 커스텀 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")
}
}
}
}
}
dokka {
dokkaSourceSets {
main {
sourceLink {
localDirectory.set(file("src/main/kotlin"))
remoteUrl.set(new URI("https://github.com/your-repo"))
remoteLineSuffix.set("#L")
}
}
}
}
localDirectory — 로컬 소스 디렉터리의 경로예요. 이 경로는 현재 프로젝트의 루트에 상대적이어야 해요.
remoteUrl — 문서 독자가 접근할 수 있는 소스코드 호스팅 서비스(예: GitHub, GitLab, Bitbucket 또는 소스 파일에 대해 안정적인 URL을 제공하는 어떤 호스팅 서비스든)의 URL이에요. 이 URL은 선언들의 소스코드 링크를 생성하는 데 사용돼요.
remoteLineSuffix — URL에 소스코드 줄 번호를 덧붙일 때 쓰는 접미사예요. 독자가 파일뿐 아니라 선언의 특정 줄 번호로도 이동할 수 있게 해줘요. 숫자 자체는 지정된 접미사 뒤에 붙어요. 예를 들어 이 옵션이 #L로 설정되고 줄 번호가 10이라면, 결과 URL 접미사는 #L10이 돼요.
인기 서비스에서 쓰는 접미사:
-
GitHub:
#L -
GitLab:
#L -
Bitbucket:
#lines-
기본값: #L
패키지 옵션 (Package options)
perPackageOption 구성 블록을 사용하면 matchingRegex와 일치하는 특정 패키지에 대한 옵션을 설정할 수 있어요.
import org.jetbrains.dokka.gradle.engine.parameters.VisibilityModifier
dokka {
dokkaPublications.html {
dokkaSourceSets.configureEach {
perPackageOption {
matchingRegex.set(".*api.*")
suppress.set(false)
skipDeprecated.set(false)
reportUndocumented.set(false)
documentedVisibilities.set(setOf(VisibilityModifier.Public)) // OR documentedVisibilities(VisibilityModifier.Public)
}
}
}
}
import org.jetbrains.dokka.gradle.engine.parameters.VisibilityModifier
dokka {
dokkaPublications {
html {
dokkaSourceSets.configureEach {
perPackageOption {
matchingRegex.set(".*api.*")
suppress.set(false)
skipDeprecated.set(false)
reportUndocumented.set(false)
documentedVisibilities.set([VisibilityModifier.Public] as Set)
}
}
}
}
}
matchingRegex — 패키지를 일치시키는 데 쓰는 정규 표현식이에요.
기본값: .*
suppress — 문서 생성 시 이 패키지를 건너뛸지 여부예요.
기본값: false
skipDeprecated — @Deprecated로 어노테이션된 선언을 문서화할지 여부예요. source set 수준에서 구성할 수 있어요.
기본값: false
reportUndocumented — documentedVisibilities와 다른 필터를 적용한 뒤에도 보이는, 즉 KDoc이 없는 문서화되지 않은 선언에 대한 경고를 낼지 여부예요. 이 설정은 failOnWarning과 잘 어울려요. source set 수준에서 구성할 수 있어요.
기본값: false
documentedVisibilities — Dokka가 생성된 문서에 포함해야 하는 가시성 수정자를 정의해요. 이 패키지 안의 protected, internal, private 선언을 문서화하고 싶거나, public 선언을 제외하고 내부 API만 문서화하고 싶을 때 사용해요. 추가로 Dokka의 documentedVisibilities()documentedVisibilities() 함수를 사용해 문서화할 가시성을 추가할 수도 있어요. source set 수준에서 구성할 수 있어요.
기본값: VisibilityModifier.Public
외부 문서 링크 구성 (External documentation links configuration)
externalDocumentationLinks {} 블록을 사용하면 의존성의 외부 호스팅 문서로 이어지는 링크를 만들 수 있어요.
예를 들어 kotlinx.serialization에서 타입을 사용한다면, 기본적으로 그 타입들은 문서에서 클릭할 수 없어요. 마치 해석되지 않은 것처럼 보이죠. 그런데 kotlinx.serialization의 API 참조 문서는 Dokka로 만들어져 kotlinlang.org에 게시되기 때문에, 이에 대한 외부 문서 링크를 구성할 수 있어요. 그러면 Dokka가 그 라이브러리의 타입에 대한 링크를 생성해서, 링크가 성공적으로 해석되고 클릭 가능해져요.
기본적으로 Kotlin 표준 라이브러리, JDK, Android SDK, AndroidX에 대한 외부 문서 링크가 구성돼 있어요.
register() 메서드로 각 링크를 정의해서 외부 문서 링크를 등록해요. externalDocumentationLinks API는 Gradle DSL 규칙에 맞춰 이 메서드를 사용해요.
dokka {
dokkaSourceSets.configureEach {
externalDocumentationLinks.register("example-docs") {
url("https://example.com/docs/")
packageListUrl("https://example.com/docs/package-list")
}
}
}
dokka {
dokkaSourceSets.configureEach {
externalDocumentationLinks.register("example-docs") {
url.set(new URI("https://example.com/docs/"))
packageListUrl.set(new URI("https://example.com/docs/package-list"))
}
}
}
url — 링크할 문서의 루트 URL이에요. 반드시 끝에 슬래시(/)가 있어야 해요. Dokka는 주어진 URL에 대해 package-list를 자동으로 찾고 선언들을 함께 연결하기 위해 최선을 다해요. 자동 해석이 실패하거나 로컬에 캐시된 파일을 사용하고 싶다면 packageListUrl 옵션을 설정하는 것을 고려해 보세요.
packageListUrl — package-list의 정확한 위치예요. Dokka가 자동으로 해석하도록 맡기는 대신 사용할 수 있는 대안이에요. Package list에는 하위 프로젝트와 패키지 이름 같은 문서 및 프로젝트 자체에 대한 정보가 들어 있어요. 네트워크 호출을 피하려면 로컬에 캐시된 파일일 수도 있어요.
전체 구성 (Complete configuration)
아래에서 모든 구성 옵션을 한꺼번에 적용한 예시를 볼 수 있어요.
import org.jetbrains.dokka.gradle.engine.parameters.VisibilityModifier
plugins {
id("org.jetbrains.dokka") version "2.2.0"
}
dokka {
dokkaPublications.html {
moduleName.set(project.name)
moduleVersion.set(project.version.toString())
outputDirectory.set(layout.buildDirectory.dir("dokka/html"))
failOnWarning.set(false)
suppressInheritedMembers.set(false)
suppressObviousFunctions.set(true)
offlineMode.set(false)
includes.from("packages.md", "extra.md")
}
dokkaSourceSets {
// Example: Configuration exclusive to the 'linux' source set
named("linux") {
dependentSourceSets{named("native")}
sourceRoots.from(file("linux/src"))
}
configureEach {
suppress.set(false)
displayName.set(name)
documentedVisibilities.set(setOf(VisibilityModifier.Public)) // OR documentedVisibilities(VisibilityModifier.Public)
reportUndocumented.set(false)
skipEmptyPackages.set(true)
skipDeprecated.set(false)
suppressGeneratedFiles.set(true)
jdkVersion.set(8)
languageVersion.set("1.7")
apiVersion.set("1.7")
sourceRoots.from(file("src"))
classpath.from(file("libs/dependency.jar"))
samples.from("samples/Basic.kt", "samples/Advanced.kt")
sourceLink {
localDirectory.set(file("src/main/kotlin"))
remoteUrl("https://example.com/src")
remoteLineSuffix.set("#L")
}
externalDocumentationLinks {
url = URL("https://example.com/docs/")
packageListUrl = File("/path/to/package-list").toURI().toURL()
}
perPackageOption {
matchingRegex.set(".*api.*")
suppress.set(false)
skipDeprecated.set(false)
reportUndocumented.set(false)
documentedVisibilities.set(
setOf(
VisibilityModifier.Public,
VisibilityModifier.Private,
VisibilityModifier.Protected,
VisibilityModifier.Internal,
VisibilityModifier.Package
)
)
}
}
}
}
import org.jetbrains.dokka.gradle.engine.parameters.VisibilityModifier
plugins {
id 'org.jetbrains.dokka' version '2.2.0'
}
dokka {
dokkaPublications {
html {
moduleName.set(project.name)
moduleVersion.set(project.version.toString())
outputDirectory.set(layout.buildDirectory.dir("dokka/html"))
failOnWarning.set(false)
suppressInheritedMembers.set(false)
suppressObviousFunctions.set(true)
offlineMode.set(false)
includes.from("packages.md", "extra.md")
}
}
dokkaSourceSets {
// Example: Configuration exclusive to the 'linux' source set
named("linux") {
dependentSourceSets { named("native") }
sourceRoots.from(file("linux/src"))
}
configureEach {
suppress.set(false)
displayName.set(name)
documentedVisibilities.set([VisibilityModifier.Public] as Set)
reportUndocumented.set(false)
skipEmptyPackages.set(true)
skipDeprecated.set(false)
suppressGeneratedFiles.set(true)
jdkVersion.set(8)
languageVersion.set("1.7")
apiVersion.set("1.7")
sourceRoots.from(file("src"))
classpath.from(file("libs/dependency.jar"))
samples.from("samples/Basic.kt", "samples/Advanced.kt")
sourceLink {
localDirectory.set(file("src/main/kotlin"))
remoteUrl.set(new URI("https://example.com/src"))
remoteLineSuffix.set("#L")
}
externalDocumentationLinks {
url.set(new URI("https://example.com/docs/"))
packageListUrl.set(new File("/path/to/package-list").toURI().toURL())
}
perPackageOption {
matchingRegex.set(".*api.*")
suppress.set(false)
skipDeprecated.set(false)
reportUndocumented.set(false)
documentedVisibilities.set([
VisibilityModifier.Public,
VisibilityModifier.Private,
VisibilityModifier.Protected,
VisibilityModifier.Internal,
VisibilityModifier.Package
] as Set)
}
}
}
}