Detekt自定义规则无法识别,配置detekt.yml报错求助
Detekt自定义规则未注册及配置报错问题排查
问题现象
首次为项目集成Detekt lint,完成基础配置后,在detekt.yml中添加自定义规则时编译报错:
Property 'mycustom-rule' is misspelled or does not exist.
开启debug模式后发现,自定义规则集未出现在已注册规则集列表中。
相关代码与配置
自定义规则代码
class CustomRuleSetProvider : RuleSetProvider { override val ruleSetId: String = "synthetic-import-rule" override fun instance(config: Config): RuleSet = RuleSet(ruleSetId, listOf(NoSyntheticImportRule())) } class NoSyntheticImportRule : Rule() { override val issue = Issue("NoSyntheticImport", Severity.Maintainability, "Don’t import Kotlin Synthetics " + "as it is already deprecated.", Debt.TWENTY_MINS) override fun visitImportDirective( importDirective: KtImportDirective ) { val import = importDirective.importPath?.pathStr if (import?.contains("androidx.activity.R") == true) { report( CodeSmell(issue, Entity.from(importDirective), "Importing '$import' which is a Kotlin Synthetics import.") ) } } }
规则集注册文件内容
> com.example.testlint.rules.CustomRuleSetProvider
detekt.yml配置片段
synthetic-import-rule: active: true NoSyntheticImportRule: active: true
问题原因及解决方法
注册文件格式错误:规则集注册文件中多余的
>符号会导致Detekt无法识别规则集提供者类。将文件内容修改为纯类全限定名:com.example.testlint.rules.CustomRuleSetProvider注册文件存放路径不符要求:该注册文件必须严格放在项目的
src/main/resources/META-INF/services/目录下(Android项目需确保路径为src/main/resources/META-INF/services),路径或目录名称错误会导致Detekt无法扫描到规则集。规则集未加载导致配置无效:由于前面的注册问题,规则集未被Detekt加载,因此
detekt.yml中的配置项被识别为不存在的属性。解决前两个问题后,规则集会被正常注册,配置即可生效。
内容的提问来源于stack exchange,提问作者Roony
相关产品推荐
相关产品推荐

