如何在 kotlin 中为 ktlint 编写自定义规则?
How to write custom rules for ktlint in kotlin?
我一直在尝试为 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
我的自定义规则 class(出于测试目的,它应该始终发出 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 文件本身似乎并没有被忽略,因为当我在命令中输入一个不存在的名称时出现错误。
有什么想法吗?
问题是我在本地安装了版本为 0.31.0
的 ktlint(在 pinterest 接管代码之前),而在我的 build.gradle
中我使用的是 0.33.0
(在 ptinerest 接管之后)代码)。由于许多包都被重命名了,那些不同的版本不会彼此相处。将我的本地 ktlint 更新到版本 0.33.0
后,自定义规则按预期应用。
我一直在尝试为 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
我的自定义规则 class(出于测试目的,它应该始终发出 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 文件本身似乎并没有被忽略,因为当我在命令中输入一个不存在的名称时出现错误。
有什么想法吗?
问题是我在本地安装了版本为 0.31.0
的 ktlint(在 pinterest 接管代码之前),而在我的 build.gradle
中我使用的是 0.33.0
(在 ptinerest 接管之后)代码)。由于许多包都被重命名了,那些不同的版本不会彼此相处。将我的本地 ktlint 更新到版本 0.33.0
后,自定义规则按预期应用。