💻 Настройка Detekt с помощью каталога версий и convention-плагина



Настройка Detekt под различные модули может быть сложной при работе с многогранными Android-проектами.

Однако использование convention-плагина (решения Gradle, определяющего единый набор соглашений для подмодулей проекта) и 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"))

}

}

}

}



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



Смотреть