Android 和 Kotlin DeteKt:自定义规则未运行

问题描述 投票:0回答:1

尝试在 Detekt 自定义规则上创建一些游乐场,但它不起作用。甚至不尝试查找规则集文件。

gradle 开始了

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id("io.gitlab.arturbosch.detekt").version("1.17.1")
}
...
detekt {
    toolVersion = "$detekt_version" // 1.17.1
    input = files("src/main/java")
    config = files("../detekt/detekt-config.yml")
    autoCorrect = true
    reports { ... } 
}

dependencies {
    detektPlugins "io.gitlab.arturbosch.detekt:detekt-formatting:$detekt_version"
    compileOnly "io.gitlab.arturbosch.detekt:detekt-api:$detekt_version"
    detekt "io.gitlab.arturbosch.detekt:detekt-cli:$detekt_version"
    ...
}

规则不变

class SomeCustomRule(config: Config) : Rule(config) {
    override val issue: Issue
        get() = Issue("Import thingy", Severity.Minor, "I don't like this string", Debt(10))

    override fun visitImportDirective(importDirective: KtImportDirective) {
        val import: String = importDirective.importPath?.pathStr ?: ""
        if ("appcompat" in import) {
            report(CodeSmell(
                issue,
                Entity.from(importDirective),
                "Importing $import which is an internal import"))
        }
    }
}

提供商是

class CustomRuleSetProvider : RuleSetProvider {
    override val ruleSetId: String = "detekt-custom-rules"

    override fun instance(config: Config) = RuleSet(ruleSetId, listOf(SomeCustomRule(config)))
}

最后但并非最不重要的

src/main/resources/META-INF/services/io.gitlab.arturbosch.detekt.api.RuleSetProvider

com.playgrounds.detekt.customrule.CustomRuleSetProvider

仍然——什么也没有。我试图在提供者处添加乱码 - 没有,没有错误。我什至试图破坏 META-INF 的声明。没什么。

当然,我尝试将提供程序添加到我的配置文件中,或者在 gradle 中添加项目行。错误,无法识别。

我错过了什么?

谢谢

android kotlin static-analysis detekt
1个回答
0
投票

问题可能在于 gradle 文件中存在

id 'com.android.application'
。请删除并仅保留 2 个插件 -
kotlin
io.gitlab.arturbosch.detekt

我还花了一些时间来使自定义规则发挥作用并找到了下一个规则:

  1. 创建 pure kotlin 模块:
  2. 确保
    build.gradle
    没有多余的依赖关系:
plugins {
    id("kotlin")
    id("io.gitlab.arturbosch.detekt")
}

dependencies {
    compileOnly(libs.detekt)
}

  1. main
    下创建
    resource
    文件夹。
  2. 创建
    config
    目录和
    config.yml
    文件。阅读有关如何填写的文档
  3. 创建
    META-INF.services
    目录。对我来说这是最大的问题,因为我没有注意到路径中的
    services
    文件夹
  4. 然后创建一个名为 io.gitlab.arturbosch.detekt.api.RuleSetProvider 的文件。
    请勿修改其名称
    相反,您应该提供已实现为
  5. RuleSetProvider
  6. 作为文件内容的完整类名 -
    com.your_package_name.RuleProvider
    
    

构建模块 -
    :detekt-rules:assemle
  1. 在通用配置文件中启用自定义规则并调用 
  2. ./gradlew detekt
  3. 
        
© www.soinside.com 2019 - 2024. All rights reserved.