【问题标题】:How to write custom rules for ktlint in kotlin?如何在 kotlin 中为 ktlint 编写自定义规则?
【发布时间】:2019-07-01 14:52:26
【问题描述】:

我一直在尝试为 ktlint 编写自定义规则。当我尝试通过终端执行我的自定义规则时,我没有收到任何错误,ktlint 的标准规则被执行,但我的自定义规则被忽略。可能有人知道我缺少什么吗?

我的 build.gradle:

plugins {
id 'java-library'
id 'org.jetbrains.kotlin.jvm' version '1.3.40'
id 'maven'
}

group 'com.xxx'

repositories {
    mavenCentral()
    jcenter()
}

configurations {
    ktlint
}


dependencies {
    compileOnly "com.pinterest.ktlint:ktlint-core:0.32.0"
    testCompile "junit:junit:4.12"
    testCompile "org.assertj:assertj-core:3.10.0"
    testCompile "com.pinterest.ktlint:ktlint-core:0.32.0"
    testCompile "com.pinterest.ktlint:ktlint-test:0.32.0"
}

task ktlint(type: JavaExec, dependsOn: classes) {
    main = 'com.pinterest.ktlint.Main'
    // adding compiled classes to the classpath so that ktlint would validate project's sources
    // using its own ruleset (in other words to dogfood)
    classpath = configurations.ktlint + sourceSets.main.output
    args '--debug', 'src/**/*.kt'
}

check.dependsOn ktlint

我的自定义规则类(出于测试目的,它应该总是发出 lint 错误):

package com.xxx.ktlint

import com.pinterest.ktlint.core.Rule
import org.jetbrains.kotlin.com.intellij.lang.ASTNode

class TempRule : Rule("no-var") {

    override fun visit(
        node: ASTNode,
        autoCorrect: Boolean,
        emit: (offset: Int, errorMessage: String, canBeAutoCorrected: Boolean) -> Unit
    ) {
        emit(node.startOffset, "#### TEST: KTLINT ERROR", false)
    }
}

我的com.pinterest.ktlint.core.RuleSetProvider

com.xxx.ktlint.CustomRuleSetProvider

我通过执行 gradle 任务“jar”来创建 jar,然后在终端中像这样执行 ktlint:

ktlint -R ../path/to/ktlint-rules.jar "path/to/file/**/file-to-be-checked.kt"

我没有收到任何错误,并且 ktlint 适用于应按预期检查所有标准规则的文件,但我的自定义规则只是被忽略了。 jar 文件本身似乎没有被忽略,因为当我在命令中输入一个不存在的名称时,我得到了一个错误。

有什么想法吗?

【问题讨论】:

  • 尝试运行ktlint --verbose -R ../path/to/ktlint-rules.jar "path/to/file/**/file-to-be-checked.kt"。它应该向您显示正在加载的自定义规则。如果没有 - 确保 ../path/to/ktlint-rules.jar 包含 META-INF/services/com.pinterest.ktlint.core.RuleSetProvider(检查路径)。
  • 感谢您的回复!我尝试添加--verbose。输出不变。还是一样:ktlint --verbose -R ../ktlint-rules/build/libs/ktlint-rules.jar "path/to/file/**/file-to-be-checked.kt" path/to/file/xxx/file-to-be-checked.kt:4:1: Wildcard import (cannot be auto-corrected) (no-wildcard-imports)(应用标准规则,但不是自定义规则)我检查了 ktlint-rules.jar,它确实包含 META-INF/services/com.pinterest.ktlint.core.RuleSetProvider
  • 我一直只运行 gradle 任务“jar”。这很好用。如果我运行 gradle 任务“build”,我会收到错误 Task :ktlint FAILED Error: Could not find or load main class com.pinterest.ktlint.Main

标签: kotlin lint


【解决方案1】:

问题是我在本地安装了版本为0.31.0 的ktlint(在pinterest 接管代码之前),而在我的build.gradle 中我使用的是0.33.0(在ptinerest 接管代码之后)。由于许多软件包已重命名,因此这些不同的版本将无法相处。将我的本地 ktlint 更新到版本 0.33.0 后,自定义规则已按预期应用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-06
    • 2012-08-21
    • 2013-05-20
    • 2017-09-25
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多