Detektの簡単な設定をまとめてみた

# はじめに
どうも、ikasumi1503です。[Kotlinのリンターシリーズ](https://qiita.com/ikasumi1503/items/5c4ae78a64b7a8d40ffe)のDetekt編です。Kotlin開発においてktlintと一緒に使っていきたいツールがDetektではないでしょうか。そこで、本記事ではDetektの簡単な設定方法をまとめていこうと思います。detektでktlintのようにフォーマットをする機能については載せていませんので、ご確認の上お進みください。

# 導入方法

導入方法を次のステップでまとめていきたいと思います。

1. Detektの手動リント
2. Detekt Pluginで自動リントをかける
3. Github Actions連携

### 1. Detektの手動リント
ここの部分は[公式](https://detekt.dev/docs/intro)を参考にやってみます。

プロジェクトのbuild.gradle.ktsを開きましょう。見つからないという方はshiftキーを2回押してなんでも検索によってこのファイルを見つけ出しましょう。
```
// プロジェクト構成：
your-project/
├─ build.gradle.kts        ← × 
├─ settings.gradle.kts
├─ app/
│  └─ build.gradle.kts       ← 〇ここです
```

見つけたら、早速プラグインを入れます。

``build.gradle.kts``
```
plugins {
    id("io.gitlab.arturbosch.detekt") version("1.23.8")
}
```
そして、settings.gradle.ktsに次のものがなければ入れていきましょう。私の場合最初からあったのですが、念のため入れていきます。

``settings.gradle.kts``
```
repositories {
    mavenCentral()
}
```
maven Central という場所からライブラリを探すよ、という保管先の指定らしいです。

再び戻り、build.gradle.ktsでdetektのふるまいの設定をしていきます。

``build.gradle.kts``
```
import io.gitlab.arturbosch.detekt.Detekt
detekt {
    toolVersion = "1.23.8"
    config.setFrom(rootProject.file("config/detekt/detekt.yml")) // リンタールールの設定ファイル
    buildUponDefaultConfig = true // trueで自分で書いたルール以外はデフォルト値を適用
    ignoreFailures = true // エラー時ビルドを落とさない
}

// detektの検出エラーの出力方法の設定
// 必要な形式をtrueにしてください。
tasks.withType<Detekt>().configureEach {
    jvmTarget = "17" // 筆者の場合は23が指定されてこれがないと動かなかった。根本原因不明です。
    reports {
        // detektの検出エラーの出力方法の設定
        // 必要な形式をtrueにしてください。
        xml.required.set(true) // xml形式
        html.required.set(true) // html形式
        sarif.required.set(true) // sarif形式
        md.required.set(true) // md形式
    }
}

dependencies {
    // これがないとconfig/detekt/detekt.ymlでformat関連の設定してるのにプラグイン不足していると警告が出るので追加する
    detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:1.23.1")  
}
```

これで右上に出ている**Sync now**をクリックすると、設定が適用されます。次に``./gradlew detektGenerateConfig
``コマンドを入力するとapp内に``config/detekt/detekt.yml``が作成されます。このファイルに自分のプロジェクト用のdetektルールを設定していきます。ルール内容については多すぎるため、「こんな設定があればいいな」という都度[公式](https://detekt.dev/docs/rules/comments)を参照されることを勧めます。

以上の設定が終わったのちに``./gradlew detekt``を実行して``app/build/reports/detekt``内にレポートファイルが作成されれば完了です。

### 2. Detekt Pluginで自動リントをかける

Android StudioのPluginsを開きましょう。
``左上のメニュー > File > Settings > Plugins``でDetektと検索するとDetektのプラグインが出てくるのでこちらをインストールしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4073140/c4422f89-5ea4-4bdc-a0a2-c818925ee798.png)

そのあと``Settings > Tools`` から設定画面が開かれるのでこちらに設定をいれていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4073140/c0c6149f-1c21-4564-813e-d68ba28bfddc.png)

- Enable background analysis
オンにするとリアルタイムで警告が表示される。

**Plugin Option**
- Treat detekt findings as errors
Detekt の警告を ビルドエラーとして扱う。
- Redirect detekt output and error channels to IDEs log file
Detekt の出力（ログなど）を IDE のログファイルに書き出す。
- Enable detekt's debug mode
Detekt の 詳細なデバッグ出力をログに記録

**Rules**
- Build rules upon the default configuration
Detekt の デフォルトルールを有効にした上で、設定ファイルで上書きする方式。
- Enable formatting (ktlint) rules
ktlintベースによるチェックを有効化。スペースや改行などの警告が出るが、自動整形はされない。
- Enable all rules (not recommended)
Detektのすべてのルールを有効にする（非推奨：ノイズが多くなる）。

**Files**
- Configuration file(s)
Detekt に読み込ませる 設定ファイル（detekt.ymlなど）を追加する場所。

設定が完了したら**Apply**または**OK**を押しましょう。
編集中にDetektのwarningやerrorが出ていれば完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4073140/e8f8a698-b45d-4d1a-8537-8e3f08e2ac2c.png)

### 3. Github Actions連携

PR時にDetektで検知されるとエラー内容をまとめたファイルを作成するようにします。
プロジェクトの``.github/workflows``にymlファイルを入れていきます。
ファイル内容は長いので次のレポジトリ内に入れています。あくまで例としてAIに吐き出させたものを使っています。一応私の環境では動作確認済みです。
https://github.com/ikasumi1503/KtlintSample

``detekt_example.yml`` ... プルリクエストしたら、Detektを実行してワークフローのコンソール内で警告内容をXML形式で吐き出しています。
``detekt_reviewdog_example.yml`` ... 一応reviewdogバージョンも出しておきます。プルリクエストしたら警告内容をPRコメントにばらまきます。publicのレポジトリにしかコメントできません。
以上のファイルがmainブランチにないと機能しない点にご注意ください。

# おわりに
以上がDetektの簡単な設定方法です。ぜひ試してみてください。