- PVSM.RU - https://www.pvsm.ru -

Статический анализатор Detekt для Kotlin

Пора полюбить статические анализаторы! Встречайте Detekt на Kotlin

Если Вы уже знаете о чем пойдет речь и Вас интересут только внедрение в проект, переходите сразу к пункту установки.

Что-же это такое?

image

Анализ программного обеспечения, производимый (в отличие от динамического анализа) без реального выполнения исследуемых программ. Википедия [1]

А своими словами — это удобный инструмент, помогающий в соблюдении правил хорошего кода. Позволяющий очень гибко настраивать фильры по определению плохого кода. Который при каждом запуске сформирует некий отчет, включающий статистические данные об обнаруженных конфликтах, информацию о них, позволяющую определить где произошел конфликт и его тип.

Статические анализаторы облегчают работу ревьюера и в целом экономит время команды на разработку.

Допустим, у нас есть хороший PR, однако автор дал слишком длинные имена переменным, написал код, который можно легко упростить или нарушил одно из множества устанавливаемых правил в конфигурационном файле Detekt, правила не сложные, но code-review такой PR не пройдет.
Автору же придется опять переключаться между проектами, так-же и ревьюерам, уверен, мало удовольствия доставит повторное ревью.

Автоматизируйте, если это быстро и не дорого. (С) Здравый смысл

Какие бывают статические анализаторы?

Для java:

Для Kotlin:

Отвечаю на возникший у Вас в голове вопрос, Spot-bugs на Kotlin не работает.

Внедряем Detekt в проект

Detekt можно установить несколькими способами:

  1. Plugin [6] для AndroidStudio
  2. Gradle

Я считаю настройка через Gradle является более гибкой и рассказываю именно про нее.

На официальном сайте есть несколько способов установки Detekt в проет, в зависимости от версии Gradle, того, является ли он Android проектом. Но, по моему опыту внедрения в android проект, некоторые инструкции не работают. На данный момент проект очень близок к выходу 1.0. Последняя версия на момент написания статьи — release candidate 1.0.0-RC14

Итак.

Заходим на официальный сайт Gradle [7] и видим инструкцию к установке.

buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
 }
     dependencies {
         classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.0.0-RC14"
     }
}

Именно этого решения я и советую придерживаться для проекта Android.

Вы наверняка заметили, что я убрал строку apply: plugin, так как я советую отделить Detekt в отдельный файл и уже в нем применить apply.

Этап 1:

Итак, копируем этот код в build.gradle уровня приложения.

Там-же в блоке allprojects мы должны написать строку применения нашего файла содержащего настройки detekt.

allprojects {
    apply from: "$rootDir/detekt.gradle"
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
}

Этап 2:

Затем необходимо создать файл detekt.gradle

apply plugin: "io.gitlab.arturbosch.detekt"

detekt {
    toolVersion = "1.0.0-RC14"                              // Version of the Detekt CLI that will be used. When unspecified the latest detekt version found will be used. Override to stay on the same version.
    input = files("src/main/java")                          // The directories where detekt looks for input files. Defaults to `files("src/main/java", "src/main/kotlin")`.
    parallel = true                                         // Builds the AST in parallel. Rules are always executed in parallel. Can lead to speedups in larger projects. `false` by default.
    filters = ".*build.*,.*/resources/.*,.*/tmp/.*"         // Regular expression of paths that should be excluded separated by `;` or `,`.
    config = files("$rootDir/detekt-config.yml")            // Define the detekt configuration(s) you want to use. Defaults to the default detekt configuration.
    reports {
        xml {
            enabled = true                                  // Enable/Disable XML report (default: true)
            destination = file("build/reports/detekt.xml")  // Path where XML report will be stored (default: `build/reports/detekt/detekt.xml`)
        }
        html {
            enabled = true                                  // Enable/Disable HTML report (default: true)
            destination = file("build/reports/detekt.html") // Path where HTML report will be stored (default: `build/reports/detekt/detekt.html`)
        }
    }
}

Этап 3:

Теперь необходимо создать конфигурационный файл detekt-config.yml [8]

Это стандартный конфигурационный файл с официального сайта [9].

Этап 4:

Откройте консоль и выполните команду: gradlew detekt

Все!

Теперь у Вас готовы статистические данные по вашему проекту. Они отображаются в консоли, а так-же Вы можете найти их по пути: {u_project}appbuildreportsdetekt

В заключение

Очень удобно использовать Detekt при сборке в Jenkins [10]
Время исполнения задачи в проете с более чем 2000 классов составляет 4-7 секунд*.

Хочу сказать, что использование статического анализатора немного упрощает нашу работу. Ускоряет процесс разработки и экономит деньги бизнеса.

Ссылки:

Detekt github [11]
Set up Detekt [12]
default-detekt-config.yml [8]

Автор: Evleaps

Источник [13]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/razrabotka/310488

Ссылки в тексте:

[1] Википедия: https://www.pvsm.ruhttp://https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BA%D0%BE%D0%B4%D0%B0

[2] Find-bugs: https://github.com/findbugsproject/findbugs

[3] Spot-bugs: https://spotbugs.github.io/

[4] Detekt: https://arturbosch.github.io/detekt/

[5] Ktlint: https://ktlint.github.io/

[6] Plugin: https://github.com/arturbosch/detekt-intellij-plugin

[7] Gradle: https://plugins.gradle.org/plugin/io.gitlab.arturbosch.detekt

[8] detekt-config.yml: https://github.com/arturbosch/detekt/blob/master/detekt-cli/src/main/resources/default-detekt-config.yml

[9] официального сайта: https://arturbosch.github.io/detekt/configurations.html

[10] Jenkins: https://jenkins.io/

[11] Detekt github: https://github.com/arturbosch/detekt

[12] Set up Detekt: https://arturbosch.github.io/detekt/groovydsl.html

[13] Источник: https://habr.com/ru/post/442500/?utm_campaign=442500