Ktlint

KtlintはKotlin用のlinter。

本記事ではビルド設定(Gradle)に組み込んで使用する。

app/build.gradleに設定を追加する

configurations {
    ktlint
}

dependencies {
    ...
    // バージョンは本家を確認すること https://github.com/pinterest/ktlint
    ktlint "com.pinterest:ktlint:0.48.2"
}

// lintタスクを追加
task ktlint(type: JavaExec, group: "verification") {
    description = "Check Kotlin code style."
    classpath = configurations.ktlint
    main = "com.pinterest.ktlint.Main"
    args "src/**/*.kt"
}
check.dependsOn ktlint

// フォーマットタスクを追加
task ktlintFormat(type: JavaExec, group: "formatting") {
    description = "Fix Kotlin code style deviations."
    classpath = configurations.ktlint
    main = "com.pinterest.ktlint.Main"
    args "-F", "src/**/*.kt"
}

argsに指定しているパスはプロジェクトの環境に合わせる。

実行

IntelliJ IDEA・Android Studioで実行

build.gradleを開くとtask ktlinttask ktlintFormatの行の左に再生ボタン▶が表示されているのでクリックする。

実行ボタン

コマンドで実行

以下のコマンドでコードチェックを実行する。

$ ./gradlew ktlint

lint定義に従って自動修正するには以下のコマンドを実行する。

$ ./gradlew ktFormat

Github Actionsでプルリクエストやマージ時にKtlintを実行する

Githubでプルリクエスト作成時やmasterへのマージ時にチェックするには以下のようにGithub Actionsで./gradlew ktlintを実行すればよい。

name: Ktlint

on:
  pull_request:
  push:
    branches:
      - master
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Check out
        uses: actions/checkout@v3
      - name: Run ktlint
        run: ./gradlew ktlint

.editorconfig で特定ルールを disable にする

ktlintでチェックされるルールのうち、プロジェクトで不要なルールは.editorconfigで無効化できる。

プロジェクトのルートディレクトリに.editorconfigを作成し以下のように記述する。

[*.{kt,kts}]
ktlint_standard_ルール名 = disabled

ktlintの標準ルールを無視するにはktlint_standard_に続いてルール名を書く。
ルール名はコマンドラインで失敗させると確認できる。

$ ./gradlew ktlint
...
> Task :app:ktlint FAILED
/path/to/project/FirstFragment.kt:23:10: Missing trailing comma before ")" (trailing-comma-on-call-site)

Summary error count (descending) by rule:
  trailing-comma-on-call-site: 1

FAILURE: Build failed with an exception.
...

上記の場合は(trailing-comma-on-call-site)とあるのでktlint_standard_をつけてktlint_standard_trailing-comma-on-call-siteとなる。

[*.{kt,kts}]
ktlint_standard_trailing-comma-on-call-site = disabled

.editorconfigを作成して再びktlintを実行すると上記で検出された違反は無視されて成功する。

$ ./gradlew ktlint

Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

See https://docs.gradle.org/7.3.3/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 3s
1 actionable task: 1 executed

標準ルールの一覧と名前は以下のサイトから確認できる。
Ktlint Standard rules