ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ktlint 快速上手:零配置的 Kotlin 代码风格检查与自动格式化指南

ktlint 快速上手:零配置的 Kotlin 代码风格检查与自动格式化指南 开发工具代码质量Lint格式化【免费下载链接】ktlintAn anti-bikeshedding Kotlin linter with built-in formatter项目地址https://gitcode.com/gh_mirrors/kt/ktlint点击查看免费下载ktlint 是一款遵循 anti-bikeshedding反无休止风格争论理念的 Kotlin 静态代码检查工具内置格式化器其设计灵感源自 JavaScript 生态的standard与 Go 生态的gofmt。本指南以当前仓库的 README.md 为主线带你完成从安装、默认扫描到自动修复的完整实践闭环并深入仓库源码说明其零配置背后的实现原理帮助你快速掌握在 Kotlin 项目中使用 ktlint 的日常操作与扩展方式。ktlint 的核心特性ktlint 的目标是让团队无需在代码风格上反复争论用一套开箱即用的约定即可完成风格统一。根据仓库 README.md 的归纳其关键特性包括无需配置即可使用No configuration required开箱即用默认扫描规则覆盖绝大多数 Kotlin 风格约定内置规则集Built-in Rule sets标准规则集由 100 条规则组成详见下文内置标准规则集一节内置格式化器Built-in formatter大部分风格违规可以被自动修复支持.editorconfig规则可通过.editorconfig进行细粒度调整与开关多种内置报告器reportersplain、json、html、checkstyle等可执行 JAR 与原生二进制既可在 JVM 上运行也可通过 GraalVM 原生镜像直接执行可扩展自定义规则集与报告器通过 JAR 加载第三方规则与输出格式。快速开始第一步安装在 macOS 或 Linux 上最简单的方式是通过 Homebrew 安装brew install ktlint除 Homebrew 外ktlint 还支持多种安装渠道原生二进制与可执行 JAR每个 release 均提供 Linux x86-64、macOS Apple Silicon、Windows x86-64 三种原生可执行文件GraalVM 原生镜像以及需要 JVM 的ktlint可执行 JAR 和供 Windows 使用的ktlint.bat详见 安装与下载校验其他包管理器如 MacPortsport install ktlint等构建工具集成通过 Maven / Gradle 插件接入构建生命周期详见 集成方式。注意原生可执行文件由 GraalVMnative-image预编译运行时无法通过命令行加载第三方规则集/报告器 JAR只能使用内置规则与报告器需要自定义扩展时请使用可执行 JARktlint。第二步检查并格式化代码ktlint 会递归扫描当前目录及其子目录下所有.kt与.kts文件并对能够自动修复的违规进行修正# 自动修复代码风格违规两种写法等价 ktlint --format # 或 ktlint -F在仓库的 KtlintCommandLine.kt 中可以确认--format与-F为同一选项的两个名称。更完整的命令行用法globs、报告器、baseline、git hooks 等参见 CLI 使用文档。零配置背后的实现默认扫描模式与内置标准规则集为什么直接运行ktlint就能检查整个项目源码给出了答案。默认匹配模式在 FileUtils.kt 中定义了默认的文件扩展名与默认 glob 模式private val DEFAULT_KOTLIN_FILE_EXTENSIONS setOf(kt, kts) internal val DEFAULT_PATTERNS DEFAULT_KOTLIN_FILE_EXTENSIONS.map { **/*.$it }即默认情况下匹配所有递归路径下的**/*.kt与**/*.kts。当命令行未提供任何文件参数时KtlintCommandLine.kt 会启用DEFAULT_PATTERNS随后通过Files.walkFileTree遍历目录树隐藏目录如.git会被跳过见 FileUtils.kt。内置标准规则集标准规则集在 StandardRuleSetProvider.kt 中注册了 100 条规则覆盖命名、间距、换行、KDoc、导入排序、缩进等方方面面。几个有代表性的规则规则 IDstandard:前缀职责源码位置filename文件名必须与顶层类一致FilenameRule.ktfinal-newline文件末尾必须有换行FinalNewlineRule.ktindent缩进风格配合indent_size/indent_styleIndentationRule.ktimport-ordering导入语句排序ImportOrderingRule.ktmax-line-length最大行长度MaxLineLengthRule.ktno-unused-imports/no-wildcard-imports未使用与通配符导入NoUnusedImportsRule.kt / NoWildcardImportsRule.ktno-semi/no-trailing-spaces禁止分号与行尾空格NoSemicolonsRule.kt / NoTrailingSpacesRule.ktspacing-*如op-spacing、comma-spacing、paren-spacing各类符号周围空格对应 SpacingAroundOperatorsRule.kt 等trailing-comma-on-declaration-site/-call-site尾随逗号策略TrailingCommaOnDeclarationSiteRule.kt 等部分规则之间存在执行顺序依赖例如max-line-length需要依赖某些换行规则先执行规则的依赖关系图见 规则依赖说明示意图rule-dependencies.png位于 documentation/release-latest/docs/assets/images/rule-dependencies.png。另外标准规则集中标记为experimental实验性的规则默认不执行必须在.editorconfig中设置ktlint_experimental enabled才会启用。通过 .editorconfig 配置规则ktlint 使用有限的.editorconfig属性进行额外配置。每个属性在未显式定义时都有合理的默认值属性需要在[*.{kt,kts}]分段下设置才能生效。详细参考 配置文档。注意IntelliJ IDEA 存在一个与.editorconfig相关的自动格式化问题会在 glob 语句中额外加入空格把[*{kt,kts}]变成[*{kt, kts}]导致 ktlint 忽略该分段。应始终写作[*.{kt,kts}]且中间无空格。代码风格默认采用ktlint_official风格也可切换为intellij_idea或android_studio[*.{kt,kts}] ktlint_code_style ktlint_official启用 / 禁用规则规则集与单条规则分别通过ktlint_前缀的属性进行开关[*.{kt,kts}] ktlint_standard disabled # 禁用 standard 规则集全部规则 ktlint_experimental enabled # 启用所有规则集中的实验性规则 ktlint_custom-rule-set enabled # 启用自定义规则集非 ktlint 提供 ktlint_standard_final-newline disabled # 禁用单条规则 final-newline ktlint_standard_some-experimental-rule enabled # 启用标准规则集中的某条实验性规则规则属性的优先级高于规则集属性例如即使整个规则集被禁用只要某条规则被单独启用该规则仍会执行。规则专属配置项一些规则支持专属配置属性仅在该规则启用时生效配置项对应规则ij_kotlin_allow_trailing_comma/ij_kotlin_allow_trailing_comma_on_call_site尾随逗号相关规则ij_kotlin_imports_layout/ij_kotlin_packages_to_use_import_on_demandimport-ordering/no-wildcard-importsindent_size/indent_styleindentinsert_final_newlinefinal-newlinektlint_chain_method_rule_force_multiline_when_chain_operator_count_greater_or_equal_thanchain-method-continuationktlint_class_signature_rule_force_multiline_when_parameter_count_greater_or_equal_thanclass-signaturektlint_ignore_back_ticked_identifiermax-line-lengthktlint_function_naming_ignore_when_annotated_withfunction-namingktlint_function_signature_body_expression_wrapping/ktlint_function_signature_rule_force_multiline_when_parameter_count_greater_or_equal_thanfunction-signaturemax_line_lengthmax-line-length及若干其他规则按目录覆盖配置.editorconfig天然支持按目录分段覆盖属性例如[*.{kt,kts}] ktlint_standard_import-ordering disabled [api/*.{kt,kts}] ktlint_standard_indent disabled上述配置中import-ordering在所有包含api子包被禁用而indent仅在api包及其子包被禁用。常用命令行操作下面命令均可在 CLI 使用文档 找到完整说明其参数解析与执行逻辑位于 KtlintCommandLine.kt。使用 glob 精确指定扫描范围glob 采用.gitignore风格语法从左到右处理!前缀表示取反排除隐藏文件夹会被跳过# 检查 src/ 下所有 .kt 文件但排除以 Test.kt 结尾的文件 ktlint src/**/*.kt !src/**/*Test.kt # 检查 src/ 下所有 .kt 文件但排除 generated 目录及其子目录 ktlint src/**/*.kt !src/**/generated/**若只给出排除模式而没有包含模式ktlint 会自动使用默认包含模式**/*.kt、**/*.kts作为兜底见 FileUtils.kt。加载自定义规则集ktlint --ruleset/path/to/custom-ruleset.jar # 或 ktlint -R /path/to/custom-ruleset.jar--ruleset选项在源码中定义为可逗号分隔、可多次指定的参数KtlintCommandLine.kt即一次可以加载多个自定义规则集 JAR。若规则集中含实验性规则同样需要ktlint_experimental enabled才会运行。违规报告与多报告器未指定报告器时默认使用plain报告器。可按文件分组、按规则统计或输出多种格式# 按文件分组显示违规 ktlint --reporterplain?group_by_file # 按规则统计违规数量适合存量项目分析规则分布 ktlint --reporterplain-summary # 同时输出到控制台与文件多个 reporter 可叠加 ktlint --reporterplain --reportercheckstyle,outputktlint-report-in-checkstyle-format.xml内置报告器包括plain、plain-summary、json、sarif、checkstyle、html其实现分布在 ktlint-cli-reporter-json、ktlint-cli-reporter-checkstyle、ktlint-cli-reporter-html 等独立模块中。第三方报告器可通过--reporterid,artifact/path/to/reporter.jar,output...方式加载。使用 baseline 渐进式清理存量问题存量项目违规较多时可先建立 baseline后续运行会静默忽略 baseline 中已登记的违规ktlint --baselinektlint-baseline.xml # 文件不存在时会自动创建读取 stdin 与输出到 stdout# 从 stdin 读取代码并检查违规输出到 stderr ktlint --stdin # 从 stdin 读取并格式化格式化结果写到 stdout违规输出到 stderr ktlint --stdin -F配合--stdin-path /path/to/file/Foo.kt可为 stdin 内容提供一个虚拟文件路径供依赖文件名的规则如filename使用此时--format不会改写该真实文件。从源码看当从 stdin 读取时 ktlint 会自动禁用filename规则KtlintCommandLine.kt因为该规则无法与 stdin 配合使用。生成 .editorconfig 脚手架# 按指定代码风格生成 .editorconfig ktlint generateEditorConfig --code-style ktlint_official # 生成时同时考虑自定义规则集的规则 ktlint --ruleset/path/to/custom-ruleset.jar generateEditorConfig --code-style android_studio生成的配置文件只包含当前已加载规则实际使用到的配置项。该功能由 GenerateEditorConfigSubCommand.kt 实现。安装 Git 钩子在提交或推送前自动执行检查ktlint installGitPreCommitHook ktlint installGitPrePushHook退出码约定与 CI 或工具链集成时需关注退出码定义于 KtlintCommandLine.kt退出码含义0执行成功若含格式化选项则无违规或全部违规已被自动修复1已成功格式化但仍有至少一条违规需手动修复通常不可自动修复2发生 IO 异常检查日志3stdin 输入不是合法的 Kotlin脚本代码4stdin 输入执行期间发生异常开启日志查看堆栈5命令行选项指向无效路径6提供的规则集 JAR 不受支持7报告器配置无效123使用--force-lint-after-format时格式化结果无法通过再解析仅用于回归测试其他常用选项--color/--color-namecolorName彩色输出并自定义颜色-h/--help打印帮助信息--limitn限制最多显示的错误数默认显示全部--relative以相对于工作目录的路径输出dir/file.kt而非绝对路径--patterns-from-stdin[分隔符]从 stdin 读取额外的匹配模式默认以换行分隔空字符串表示使用 NUL 字节与--stdin互斥-V/--version打印版本信息--log-level/-l设置最小日志级别trace、debug、info、warn、error、none默认info--ignore-autocorrect-failures忽略所有无法自动修复的违规源码过滤逻辑见 KtlintCommandLine.kt。扩展 ktlint自定义规则集ktlint 依赖 JavaServiceLoader机制发现 classpath 上的规则集。仓库中的 ktlint-ruleset-template 是一个可直接克隆的最小示例工程Gradle 构建完整的开发说明见 自定义规则集文档。编写一条规则规则继承RuleV2并在 AST 遍历钩子中实现检查逻辑。以模板中的 NoVarRule.kt 为例public class NoVarRule : RuleV2( ruleId RuleId($CUSTOM_RULE_SET_ID:no-var), about RuleV2.About( maintainer Your name, repositoryUrl https://github.com/your/project/, issueTrackerUrl https://github.com/your/project/issues, ), ) { override fun beforeVisitChildNodes( node: ASTNode, emit: (offset: Int, errorMessage: String, canBeAutoCorrected: Boolean) - AutocorrectDecision, ) { if (node.elementType VAR_KEYWORD) { emit(node.startOffset, Unexpected var, use val instead, false) } } }一条规则需要实现以下钩子中的一个或多个Rule.beforeFirstNodeRuleAutocorrectApproveHandler.beforeVisitChildNodesRuleAutocorrectApproveHandler.afterVisitChildNodesRule.afterLastNode。在 AST 遍历过程中这些钩子按名称所示顺序被调用可以用 IntelliJ IDEA 的 PsiViewer 插件查看任意代码的 AST 结构辅助开发截图 psi-viewer.png。注册规则集规则集通过 CustomRuleSetProvider.kt 暴露规则实例并需要在resources/META-INF/services/io.github.ktlint.core.cli.ruleset.core.api.RuleSetV2Provider文件中注册提供者全限定名ktlint 才能通过ServiceLoader发现它。构建并运行cd ktlint-ruleset-template/ ../gradlew build然后使用-R加载构建出的 JAR 并检查示例代码echo var v 0 test.kt ktlint -R build/libs/ktlint-ruleset-template.jar --log-leveldebug --relative test.kt从--log-leveldebug输出可以看到自定义规则custom:no-var会被合并进规则执行顺序中与标准规则集规则一起按依赖关系排序并输出违规信息。如果你只想集成到既有项目而不必逐条手写规则也可以直接使用社区 Gradle/Maven 插件如 jlleitschuh/ktlint-gradle、jeremymailen/kotlinter-gradle、diffplug/spotless 等参见 集成文档。结语从零配置扫描、-F一键格式化到.editorconfig细粒度调优再到自定义规则集扩展ktlint 为 Kotlin 项目的代码风格治理提供了一条完整路径。日常使用中记住三个核心动作即可直接运行ktlint做检查、用ktlint -F自动修复、用ktlint --baseline...处理存量项目。更细致的用法可随时查阅仓库内的 CLI 文档 与 规则配置文档。赞分享开发工具代码质量Lint格式化【免费下载链接】ktlintAn anti-bikeshedding Kotlin linter with built-in formatter项目地址https://gitcode.com/gh_mirrors/kt/ktlint点击查看免费下载相关推荐Ktlint 完整指南无需配置的 Kotlin 代码风格检查与自动格式化工具Ktlint 完整指南无需配置的 Kotlin 代码风格检查与自动格式化工具 Ktlint 是一个面向 Kotlin 的「反自行车棚效应」anti bike开发工具代码质量Lint格式化ktlint 快速上手指南从零开始安装、Lint 与自动格式化 Kotlin 代码ktlint 快速上手指南从零开始安装、Lint 与自动格式化 Kotlin 代码 本篇指南以 ktlint 官方快速入门文档 documentation/开发工具代码质量Lint格式化Kotlin代码规范利器ktlint零配置自动格式化完整指南Kotlin代码规范利器ktlint零配置自动格式化完整指南 Kotlin代码规范利器ktlint是一款强大的 Kotlin代码格式化工具 能够帮助开发者自开发工具代码质量Lint格式化上一篇如何3步搭建你的私有知识库AnythingLLM终极指南下一篇FridaBypassKit 实战在 agentic-awesome-skills 的 apk-reverse 工作流中一键绕过 Android 四大检测创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表