Android/Study

[Android] ktlint, detekt를 적용해보기

Tenacity_Dev 2024. 1. 20. 18:35
728x90

오늘은 ktlint, detekt에 대해서 공부를 해보자.

Ktlint와 Detekt는 모두 Kotlin 언어로 작성된 코드에서 코드 품질을 유지하고 개선하기 위한 도구들이다.

 

ktlint

  • 목적: Ktlint는 Kotlin 코드의 일관된 스타일을 유지하고 코드 포맷을 검사하는 데 사용된다.
  • 기능:
    • 코드 포맷팅 규칙을 정의하고 이를 기반으로 Kotlin 코드의 스타일을 검사한다.
    • 코드베이스의 일관된 형식을 유지하면서 코드 리뷰 및 유지보수를 용이하게 한다.
  • 사용법:
    • Ktlint는 Gradle, Maven, 등의 빌드 도구에서 통합하여 사용할 수 있다.
    • 터미널에서 직접 사용하거나 CI/CD 파이프라인에 통합하여 자동 검사할 수 있다.

 

detekt

  • 목적: Detekt는 Kotlin 코드에서 일반적인 코드 품질 문제를 찾고 신호/노이즈 비율을 높이기 위한 정적 분석 도구이다.
  • 기능:
    • 복잡성, 중복 코드, 코딩 표준 위반 등과 같은 코드 품질 문제를 검사한다.
    • 개발자가 정의한 규칙을 통해 프로젝트에 특화된 검사를 수행할 수 있다.
  • 사용법:
    • Detekt 또한 Gradle, Maven, 등의 빌드 도구에서 통합하여 사용할 수 있다.
    • 검사 규칙을 설정하고, 터미널에서 실행하거나 CI/CD 파이프라인에 통합하여 자동 검사를 수행할 수 있다.

 

실제로 적용하기

// build.gradle.kts

val ktlint by configurations.creating
val detekt by configurations.creating

//.....(생략)

dependencies {

    implementation("androidx.constraintlayout:constraintlayout:2.1.4")
    ktlint("com.pinterest.ktlint:ktlint-cli:1.1.0") {
        attributes {
            attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling.EXTERNAL))
        }
    }

    detekt("io.gitlab.arturbosch.detekt:detekt-cli:1.23.3")

//.... (생략)

}

val detektTask = tasks.register<JavaExec>("detekt") {
    mainClass.set("io.gitlab.arturbosch.detekt.cli.Main")
    classpath = detekt

    val input = projectDir
    val config = "$projectDir/detekt.yml"
    val exclude = ".*/build/.*,.*/resources/.*"
    val params = listOf("-i", input, "-c", config, "-ex", exclude)

    args(params)
}

val ktlintCheck by tasks.registering(JavaExec::class) {
    group = LifecycleBasePlugin.VERIFICATION_GROUP
    description = "Check Kotlin code style"
    classpath = ktlint
    mainClass.set("com.pinterest.ktlint.Main")
    args(
        "**/src/**/*.kt",
        "**.kts",
        "!**/build/**",
    )
}

tasks.check {
    dependsOn(ktlintCheck)
    dependsOn(detektTask)
}

tasks.register<JavaExec>("ktlintFormat") {
    group = LifecycleBasePlugin.VERIFICATION_GROUP
    description = "Check Kotlin code style and format"
    classpath = ktlint
    mainClass.set("com.pinterest.ktlint.Main")
    jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED")
    // see https://pinterest.github.io/ktlint/install/cli/#command-line-usage for more information
    args(
        "-F",
        "**/src/**/*.kt",
        "**.kts",
        "!**/build/**",
    )
}

 

또한

Ci/CD에서도 적용이 가능하다

name: Android CI
on:
  pull_request:
    branches: [ develop ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      ...

      - name: Run ktlint
        run:  ./gradlew ktlintCheck

      - name: Run detekt
        run: ./gradlew detekt

      ...

 

참고

https://medium.com/sungbinland/ktlint-detekt-%EC%9C%BC%EB%A1%9C-%EC%BD%94%EB%93%9C-%ED%80%84%EB%A6%AC%ED%8B%B0-%ED%96%A5%EC%83%81%EC%8B%9C%ED%82%A4%EA%B8%B0-a085c7eba2cd

 

ktlint, detekt 으로 코드 퀄리티 향상시키기

kotlin code beautifier

medium.com

 

728x90