Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在kotlin中为ktlint编写自定义规则?_Kotlin_Lint - Fatal编程技术网

如何在kotlin中为ktlint编写自定义规则?

如何在kotlin中为ktlint编写自定义规则?,kotlin,lint,Kotlin,Lint,我一直在尝试为ktlint编写自定义规则。当我试图通过终端执行我的自定义规则时,我没有收到任何错误,ktlint的标准规则被执行,但我的自定义规则被忽略。也许有人知道我错过了什么 我的身材。格雷德尔: plugins { id 'java-library' id 'org.jetbrains.kotlin.jvm' version '1.3.40' id 'maven' } group 'com.xxx' repositories { mavenCentral() jcent

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

我的身材。格雷德尔:

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)
    }
}
My com.pinterest.ktlint.core.RuleSetProvider:

我通过执行gradle任务jar创建jar,然后在终端中执行ktlint,如下所示:

ktlint -R ../path/to/ktlint-rules.jar "path/to/file/**/file-to-be-checked.kt"
我没有收到任何错误,ktlint应用于应该按照预期的所有标准规则检查的文件,但我的自定义规则被忽略。jar文件本身似乎没有被忽略,因为当我在命令中输入一个不存在的名称时,我得到了一个错误


有什么想法吗?

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

尝试运行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检查路径。感谢您的回复!我尝试添加-详细。输出不变。它仍然是相同的:ktlint-verbose-R../ktlint-rules/build/libs/ktlint-rules.jar path/to/file/**/file-to-checked.kt path/to/file/xxx/file-to-checked.kt:4:1:通配符导入无法自动更正没有应用标准规则但没有自定义规则的通配符导入我检查了ktlint-rules.jar,它确实包含META-INF/services/com.pinterest.ktlint.core.RuleSetProviderI我总是运行gradle任务jar。那很好。如果我运行gradle任务生成,我会得到错误任务:ktlint失败错误:无法找到或加载主类com.pinterest.ktlint.main。
ktlint -R ../path/to/ktlint-rules.jar "path/to/file/**/file-to-be-checked.kt"