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

Kotlin — это статически типизированный язык программирования на основе JVM, разработанный компанией JetBrains. Он был представлен Google в первую очередь для создания мобильных приложений на платформе Android. Используя Kotlin, разработчики могут писать код быстрее и более качественно. Тем не менее, как и в случае с любым другим языком программирования, важно соблюдать набор правил, чтобы обеспечить высокую производительность и читаемость кода.

Статический анализ кода

033ab487ede415e50094cecae9b3c0d0.png

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

Если ваш проект интегрирован с системой непрерывной интеграции и непрерывной доставки (CI/CD), статический анализ кода выполняется автоматически на этапе тестирования. Это позволяет выявлять и исправлять ошибки и уязвимости уже на этапе создания новых сборок, что повышает надежность и безопасность вашего приложения.

Инструменты анализа кода для Kotlin

c65b413623a8703dc4e81c7d459a9ff2.png

При создании приложений на основе Kotlin разработчики могут столкнуться с необходимостью использования специфических инструментов для статического анализа кода. В мире Java существуют такие хорошо известные инструменты, как PMD, FindBugs и Checkstyle. Однако с Kotlin, учитывая его отличительный синтаксис, необходимо обратить внимание на другие инструменты.

Среди них можно выделить Ktlint, Detekt и плагин Jetbrains Inspection Plugin. В данной статье мы рассмотрим, как легко и эффективно внедрить инструмент Ktlint в ваш проекте Android.

Что такое Ktlint?

Ktlint — это инструмент статического анализа кода на языке программирования Kotlin. Он является частью экосистемы инструментов для разработки на Kotlin и соответствует стандартам Kotlin coding conventions и Kotlin Style Guide.

Основные возможности Ktlint

  1. Проверка стиля кода: Ktlint анализирует ваш код и проверяет его на соответствие стандартам оформления кода, включая отступы, использование пробелов или табуляции, длину строк и многое другое. Это помогает поддерживать единообразие кода в проекте и делает его более читаемым.

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

  3. Интеграция со средами разработки: Ktlint интегрируется с популярными средами разработки, такими, как Android Studio и IntelliJ IDEA, что позволяет разработчикам видеть подсказки и исправления стиля непосредственно в своей IDE.

  4. Кастомизация правил: Вы можете настроить Ktlint под свои нужды, устанавливая собственные правила стиля кода или модифицируя существующие.

Процесс работы с Ktlint можно разделить на две основные части:

  1. Анализ кода (ktlintCheck) —это команда, которая используется для запуска проверки статического анализа кода с помощью Ktlint. Она сканирует и анализирует исходный код на языке Kotlin в соответствии с конфигурационными правилами, определенными для проекта, и выдает сообщения о нарушениях стандартов кодирования, если такие нарушения обнаружены. Эта команда помогает разработчикам выявить и исправить проблемы в коде, стилистические ошибки или несоответствие стандартам.

  2. Форматирование кода (ktlintFormat) —это команда, которая также связана с Ktlint, но вместо выдачи сообщений об ошибках и нарушениях стандартов, она пытается автоматически отформатировать код в соответствии с конфигурационными правилами Ktlint. Это полезно, если вы хотите, чтобы Ktlint автоматически исправил стилистические ошибки в коде.

Таким образом, используя Ktlint, вы экономите свое время и трудозатраты, поскольку вам не нужно проверять свой код вручную. Вместо этого  можно заняться проектированием  логики для вашего приложения. Давайте рассмотрим, как мы можно интегрировать Ktlint в проект.

Использование Klint в вашем проекте

Первым шагом будет создание файла Gradle для Ktlint. Назовите его как вам удобно, в нашем случае, мы назовем его «ktlint.gradle». Разместите этот файл на корневом уровне, где находится ваш файл «build.gradle».

// ktlint.gradle (project-level)
configurations {
   ktlint
}

dependencies {
   ktlint("com.pinterest.ktlint:ktlint-cli:1.0.0") {
       attributes {
           attribute(Bundling.BUNDLING_ATTRIBUTE, getObjects().named(Bundling, Bundling.EXTERNAL))
       }
   }
}

tasks.register("ktlintCheck", JavaExec) {
   group = "verification"
   description = "Check Kotlin code style."
   classpath = configurations.ktlint
   mainClass = "com.pinterest.ktlint.Main"
   args "src/**/*.kt", "**.kts", "!**/build/**"
}

tasks.named("check") {
   dependsOn tasks.named("ktlintCheck")
}

tasks.register("ktlintFormat", JavaExec) {
   group = "formatting"
   description = "Fix Kotlin code style deviations."
   classpath = configurations.ktlint
   mainClass = "com.pinterest.ktlint.Main"
   jvmArgs "--add-opens=java.base/java.lang=ALL-UNNAMED"
   args "-F", "src/**/*.kt", "**.kts", "!**/build/**"
}

Затем мы переходим к двум важным задачам Gradle, о которых мы подробно рассказали выше: ktlintCheck и ktlintFormat. 

Нам необходимо добавить наш файл сценария Gradle в соответствующие модули проекта. Для этого мы переходим к файлу build.gradle (: app) и добавляем его, как показано ниже:

// build.gradle (Module-level)
plugins {
   id 'com.android.application'
	  /* ... */
}

apply from: "../ktlint.gradle"

android {
	  /* ... */
}

На самом деле это всё. После синхронизации проекта вы сможете увидеть задачи в меню Gradle.

d4e404821bbee50bac90b52fede0fa59.png

Использование Klint с помощью плагина в проекте

Чтобы интегрировать плагин Ktlintв проект, мы будем использовать плагин Ktlintgradle. Есть два способа интеграции плагина Ktlint. Если вы используете какой-то старый проект со старой версией gradle, вы можете интегрировать Ktlint, применив следующий код:

// build.gradle (project-level)
buildscript {
   repositories {
       mavenCentral()
   }
   dependencies {
       classpath "org.jlleitschuh.gradle:ktlint-gradle:"
   }
}

apply plugin: "org.jlleitschuh.gradle.ktlint"

Однако, если вы используете Ktlintв своем проекте с какой-либо последней версией gradle, вы можете применить плагин в файле build.gradle корневого уровня:

// build.gradle (project-level)
plugins {
   id "org.jlleitschuh.gradle.ktlint" version ""
}

Кроме того, если нужно добавить Ktlintко всем модулям вашего проекта, напишем следующие строки кода:

// build.gradle (project-level)
subprojects {
   apply plugin: "org.jlleitschuh.gradle.ktlint"
   ktlint {
       debug = true
   }
}

После добавления этих строк вы можете синхронизировать свой проект и начать использовать Ktlint.

Теперь вы можете анализировать свой код ./gradlew ktlintCheck и форматировать его с помощью ./gradlew ktlintFormat.

Анализ кода ./gradlew ktlintCheck 

Анализ кода ./gradlew ktlintCheck 

Форматирование кода ./gradlew ktlintFormat

Форматирование кода ./gradlew ktlintFormat

Настройка правил стиля

Для настройки правил стиля с использованием инструмента Ktlint нужно создать файл .editorconfig в корне вашего проекта.

.editorconfig — это конфигурационный файл, который позволяет определить правила форматирования для различных файлов в проекте. Создайте этот файл в корневой директории вашего проекта, если его еще нет.

Вот пример .editorconfig для файлов Kotlin:

# https://editorconfig.org
root = true

[*]
indent_style = space
indent_size = 4
max_line_length = 120

charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = false

[*.{kt,kts}]
ktlint_standard = enabled
ktlint_disabled_rules=no-wildcard-imports
ktlint_code_style = ktlint_official

Правила в этом примере означают следующее:

  • root = true: Указывает, что это корневой конфигурационный файл. Он применяется ко всему проекту.

  • indent_style = space: Задает стиль отступов в виде пробелов.

  • indent_size = 4: Устанавливает размер отступа в 4 пробела.

  • max_line_length = 120: Устанавливает максимальную длину строки кода в 120 символов.

  • charset = utf-8: Указывает кодировку UTF-8 для файлов.

  • trim_trailing_whitespace = true: Указывает, что необходимо удалять пробелы в конце строк.

  • insert_final_newline = false: Определяет, что не нужно вставлять пустую строку в конце файла.

  • [*.{kt, kts}]: Эта секция определяет настройки, применяемые только к файлам с расширением .kt и .kts (файлы Kotlin).

  • ktlint_standard = enabled: Включает проверку стиля кода с использованием стандартных правил Ktlint.

  • ktlint_disabled_rules = no-wildcard-imports: Отключает правило no-wildcard-imports, что позволяет использовать импорты с использованием звездочки (*).

  • ktlint_code_style = ktlint_official: Устанавливает официальный стиль кода Ktlint.

Это всего лишь пример, и вы можете настроить .editorconfig согласно вашим предпочтениям. Важно учесть, что Ktlint будет использовать эти настройки для проверки стиля кода.

Интеграция проверки Ktlint с Git CI

Интеграция проверки Ktlint с системой непрерывной интеграции (CI) Git (например, GitLab CI/CD, GitHub и т.д.) позволяет автоматически проверять стиль кода Kotlin при каждом коммите или запросе на слияние. Это помогает поддерживать стабильность и согласованность кода в проекте. Вот общий процесс интеграции Ktlint с Git CI:

#ktlint check
stages:
   - lint-check

lint-check:
   stage: lint-check
   before_script:
       - chmod +x ./gradlew
       - export GRADLE_USER_HOME=$(pwd)/.gradle
   script:
       - ./gradlew ktlintCheck

Этот скрипт выполняет проверку Ktlint на этапе lint и запускает команду ./gradlew ktlintCheck для проверки кода.

Таким образом, при интеграции Ktlint с Git CI/CD вы автоматизируете процесс проверки стиля кода и гарантируете, что код, попадающий в ваш репозиторий, соответствует стандартам Kotlin coding conventions и Kotlin Style Guide.

Заключение

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

Ссылки:

Ktlint

Ktlint github

Ktlint plugin

© Habrahabr.ru