Введение

Поддержание качества кода является краеугольным камнем успеха в постоянно развивающейся сфере разработки Android-приложений. Чистота кодовой базы обеспечивает долговечность и надежность приложения, а также способствует развитию среды совместной разработки. Среди множества инструментов, имеющихся в вашем распоряжении, Detekt выделяется как надежное средство статического анализа для Kotlin, предназначенное для выявления признаков кода “с душком”, потенциальных ошибок и других проблем в кодовой базе.

Настройка Detekt под различные модули может быть сложной при работе с многогранными Android-проектами. Однако использование convention-плагина (решения Gradle, определяющего единый набор соглашений для подмодулей проекта) и AndroidDetektConventionPlugin может упростить этот процесс. Следуя данному руководству, вы без лишних усилий настроите Detekt в Android-проекте. Предоставленные в этом руководстве знания и инструменты помогут повысить качество кода как опытному разработчику, так и новичку. Их применение обеспечит Android-приложению надежность и ремонтопригодность. Итак, погрузимся в тонкости конфигурации Detekt для Android-проектов, чтобы поднять стандарты работы с кодом на новую высоту.

Используя каталог версий и convention-плагин, вы сможете упростить настройку Detekt для всех необходимых модулей с помощью AndroidDetektConventionPlugin.

Шаг 1

Добавьте зависимость Detekt в libs.versions.toml.

[versions]
detekt="1.23.1"

[libereries]
detekt-gradlePlugin = { group = "io.gitlab.arturbosch.detekt", name = "detekt-gradle-plugin", version.ref = "detekt" }

Шаг 2

Добавьте зависимость в build.gradle.kts convention-модуля:

dependencies {
compileOnly(libs.detekt.gradlePlugin)
}

Шаг 3

Создайте файл с именем AndroidDetektConventionPlugin.

import io.gitlab.arturbosch.detekt.extensions.DetektExtension
import ir.composenews.configureDetekt
import ir.composenews.libs
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.getByType

class AndroidDetektConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
pluginManager.apply(
libs.findLibrary("detekt-gradlePlugin").get().get().group.toString()
)
val extension = extensions.getByType<DetektExtension>()
configureDetekt(extension)
}
}
}

Шаг 4

Создайте в convention-модуле файл Detekt.kt:

internal fun Project.configureDetekt(extension: DetektExtension) = extension.apply {
tasks.named<Detekt>("detekt") {
reports {
xml.required.set(true)
html.required.set(true)
txt.required.set(true)
sarif.required.set(true)
md.required.set(true)
}
}
dependencies {
"detektPlugins"(libs.findLibrary("detekt-formatting").get())
}
}

Шаг 5

Зарегистрируйте AndroidDetektConventionPlugin в build.gradle.kts convention-модуля:

gradlePlugin {
plugins {
// другие плагины
register("androidDetekt") {
id = "composenews.android.detekt"
implementationClass = "AndroidDetektConventionPlugin"
}
}
}

Шаг 6

Используйте его в проекте:

class AndroidLibraryConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
with(pluginManager) {
apply("com.android.library")
apply("org.jetbrains.kotlin.android")
apply("composenews.android.detekt") // here
apply("composenews.android.ktlint")
}

extensions.configure<LibraryExtension> {
configureKotlinAndroid(this)
defaultConfig.targetSdk = Integer.parseInt(libs.findVersion("projectTargetSdkVersion").get().toString())
}
dependencies {
add("androidTestImplementation", kotlin("test"))
add("testImplementation", kotlin("test"))
}
}
}
}

Окончательный результат

class AndroidLibraryConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
with(pluginManager) {
apply("com.android.library")
apply("org.jetbrains.kotlin.android")
apply("composenews.android.detekt") // here
apply("composenews.android.ktlint")
}

extensions.configure<LibraryExtension> {
configureKotlinAndroid(this)
defaultConfig.targetSdk = Integer.parseInt(libs.findVersion("projectTargetSdkVersion").get().toString())
}
dependencies {
add("androidTestImplementation", kotlin("test"))
add("testImplementation", kotlin("test"))
}
}
}
}
internal fun Project.configureDetekt(extension: DetektExtension) = extension.apply {
tasks.named<Detekt>("detekt") {
reports {
xml.required.set(true)
html.required.set(true)
txt.required.set(true)
sarif.required.set(true)
md.required.set(true)
}
}
dependencies {
"detektPlugins"(libs.findLibrary("detekt-formatting").get())
}
}
[versions]
detekt="1.23.1"

[libereries]
detekt-gradlePlugin = { group = "io.gitlab.arturbosch.detekt", name = "detekt-gradle-plugin", version.ref = "detekt" }

В ComposeNews мы решили применить Detekt во всех модулях, которые относятся к AndroidLibrary. Побробнее о проекте ComposeNews тут.

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Vahid Garousi: Configuring Detekt with Version Catalog and Convention Plugin

Предыдущая статьяИзвлечение текста из PDF-файлов с помощью Python: исчерпывающее руководство
Следующая статья10 проектов для изучения Golang в 2023 году