KtlintはKotlinのプロジェクトで広く使われている静的解析ツールです。定義されたルールに基づいてソースコードのスタイルを検証します。自動で正しいスタイルにフォーマットすることもできます。
Ktlintを普段の業務で利用しているAndroidエンジニアは多いと思いますが、自分で一から設定する機会は意外と少ないのではないでしょうか。私も今回初めて個人のAndroidプロジェクトに導入したので、その際に調べたことを記事にまとめます。
目次
KtlintとGradleプラグイン
KtlintはPinterestがOSSとして開発したツールです。
ただし、Quick startを見るとわかるように、これ自体は単独で動作させるコマンドラインツールです。Androidプロジェクトで利用するには、Gradleプラグインを使うと便利です。
KtlintのGradleプラグインはGradle integrationにいくつか紹介されています。広く使われているのがJLLeitschuh/ktlint-gradleで、プラグインを追加するだけでGradleのタスクが使えて便利です。今回もこれを使います。
余談ですが、私はKtlintのことを、JetBrainsが開発しているKotlinの公式ツールだと思い込んでいました。そのため今回自分で調べ始めた当初は、いくら調べても公式の情報が出てこないことに困惑しました。そのうえPinterestやJLLeitschuh/ktlint-gradleなど複数のリポジトリが見つかり、どれが本物???と戸惑いました。
プロジェクトに導入する
ではJLLeitschuh/ktlint-gradleをAndroidのプロジェクトに導入する手順を説明します。といってもREADMEのHow to useに書いてある通りです。以下のように依存を定義してプラグインを導入するだけで、Gradleのタスクを実行できるようになります。
[versions]
ktlint = "12.1.2"
[plugins]
ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlint" }
plugins {
alias(libs.plugins.ktlint)
}
実行してみる
コードのチェックを実行するには、ktlintCheck
を実行します。
./gradlew ktlintCheck
例えば以下のようにif節とelse節の書き方が統一されていないコードがあると、改行が必要だと指摘してくれます。
if (flag) {
println("Hello")
} else { println("Bye") }
また、ktlintFormat
を実行すると自動でフォーマットしてくれます。
./gradlew ktlintFormat
先ほどのコードは下記のようにフォーマットされます。
if (flag) {
println("Hello")
} else {
println("Bye")
}
Androidプロジェクトに合わせて設定する
このように簡単に導入できるJLLeitschuh/ktlint-gradleですが、デフォルト設定のままAndroidのプロジェクトで利用すると、期待とは異なる結果になってしまう部分があります。そのため、少し設定を変更します。
デフォルト設定の問題点
例えば以下のようなコンポーザブル関数があるとしましょう。
@Composable
fun SampleComposable() {
Text(
text = "Hello",
modifier = Modifier
.fillMaxWidth()
.padding(8.dp)
)
}
このコードに対してktlintFormat
を実行すると、以下のようにModifier
が改行されて余分なインデントが追加されてしまいます。Jetpack Composeのコードではあまり見かけないスタイルで、違和感を感じますね。
@Composable
fun SampleComposable() {
Text(
text = "Hello",
modifier =
Modifier
.fillMaxWidth()
.padding(8.dp),
)
}
また、「Function name should start with a lowercase letter …」というエラーも出ます。コンポーザブル関数の名前は大文字から始めるのが一般的なので、このエラーは困ります。
.editorconfigファイルに設定を記述
上記のような問題点を解決するために、設定を変更します。プロジェクトのルートディレクトリに.editorconfig
ファイルを作成し、設定を記述します。
.editorconfig
の記述例は下記のようになります。
[*.{kt,kts}]
ktlint_code_style = android_studio
ktlint_function_naming_ignore_when_annotated_with=Composable
ktlint_code_style
は全体的なコーディングスタイルの設定です。android_studio
を指定すると、Androidプロジェクトで見慣れたスタイルが適用されます。上記の例で紹介したようにModifier
が勝手に改行されることもなくなります。その他、1行当たりの最大文字数や、トレイリングカンマをつけるかどうかなど、いろいろ違いがあります。具体的な違いはKtlintのルールの説明に書いてあります。
ktlint_function_naming_ignore_when_annotated_with
は、特定のアノテーションが付与された関数に対して、関数の命名規則を無視する設定です。ktlint_code_style
を設定しただけではコンポーザブル関数の名前に関するエラーが消えないので、追加で設定しています。
Ktlintで定義されているルールの一覧はStandard rulesにまとまっているので、必要に応じて.editorconfig
に設定を追加してください。
以上、AndroidのプロジェクトでKtlintを導入する方法についてまとめました。