🥊 2024的Detekt 和 Ktlint: 哪个 linter 最适合Android项目?
在 iOS 中, 游戏还没开始就已经结束了. SwiftLint 是 Swift 项目(iOS, 其他苹果平台或服务器端平台)中唯一可用的 linter. 不过, 对于 Kotlin 项目, 有两个著名的 linter: Detekt 和 KtLint. 让我们来比较一下它们, 看看其中一个是否比另一个更好.
📊 Detekt 活动统计: 自 2017 年来有 1.150k 次下载, 有112次发版, Github上有5.9星 ⭐️ 🟢. 📊 Ktlint 活动统计: 自 2016 年来有 3.350k 次下载, 有92次发版, Github上有5.9星 ⭐️ 🟢.
此项得分相等, Detekt 更年轻一些, 但似乎更受社区支持. 另一方面, ktlint 得到了大量支持, 而且比Detekt早一年.Detekt 1–1 Ktlint
🪛 Detekt 自动格式化工具: 不是内置的, 需要添加来自ktlint的额外工具, 并需要用奇怪的命令行启动 🔴 . 可以通过以下方式启动:
Copydependencies {
detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:[version]")
}
或在终端中(在此下载格式化插件之后)
$ detekt --plugin detekt-formatting-jar
🪛 Ktlint 自动格式化工具: 它是一个原生功能, 非常容易运行 ktlint —F , 和 linter 一起打包成单独的工具.
这是一个来自 Ktlint的背刺💥. Detekt 1–2 Ktlint
📐 Detekt lint规则: 规则的数量非常多, 而且超出了纯 Kotlin 的范围, 还对循环复杂度, 函数和类的大小, 方法数量限制, 参数和构造函数大小等不良实践提出警告. 在 Kotlin 方面, Detekt 可以对嵌套作用域以及滥用 run 和 apply 等函数提出警告. KtLint linter 设置简单, 但只支持 Kotlin 协议, 没有其他功能.
🥊 这是来自Detekt勾拳. 支持众多规则, 设置非常简单, 而且文档齐全. Detekt 2–2 Ktlint
🌍 生态系统: Detekt 是可扩展的, 我们可以看到自动格式化插件🤓, 还可以下载其他一些额外的规则(虽然很没用, 但值得一看). Android studio 有一个很棒的官方插件 🚀R. 他的文档解释了如何编写自定义任务和自定义规则. 对于 Ktlint 来说, 情况大致相同, 但工具的设计其实并不广泛. 我们可以实现自定义规则, 文档也足够清晰. 与Android Studio的集成没有Detekt强大而且 不是"官方的"但却是最新的 👌. 两者都支持基线.
这一点上, Detekt 只得半分. 一切都比 Ktlint 好一点, 但两边都有相同的功能. Detekt 2.5 💪–2 Ktlint
🚫 danger-插件: 我在 Ruby或 Kotlin 中发现了 4 种不同的danger-插件. 在 Ktlint 方面, 有两个: Ruby 和 Javascript (🤔R), 如果你选择了 Danger-Kotlin, 就无法使用 danger-ktlint, 而 Ruby 到目前为止仍然是最流行的. 如果将 Ruby 上的 danger-detekt 与 danger-ktlint 进行比较, detekt 更灵活一些, 有更多选项, 例如严重程度, 它允许设置本地警告, 允许在沙箱中编码, 但在 CI 端将警告视为错误..
奖励: 我使用[此插件]提取 detekt dangerfile.rb (github.com/NFesquet/da…):
# Detekt
detekt_file_report = 'detekt.xml'
if File.file?(detekt_file_report)
kotlin_detekt.skip_gradle_task = true
kotlin_detekt.severity = 'warning'
kotlin_detekt.report_file = detekt_file_report
kotlin_detekt.detekt(inline_mode: true)
else
fail "🚫 Could not find detekt file report here : `#{detekt_file_report}`, please check the [logs](#{ENV['BITRISE_BUILD_URL']})"
end
同样, Detekt 也有一半的优势. 这两个工具都有很好的危险插件, 但 Detekt 在一些小细节上更胜一筹. Detekt 3 👊 –2 Ktlint.
结论: Detekt 💪 赢了. 在我的职业生涯中, 我尝试过两种设置:
- 全 Ktlint
- Ktlint -F + Detekt
完整的 Ktlint 设置很好, 它的最大优点是作为一个单独的工具, 使用起来很方便. 但我在 Android 上使用 Detekt(工具, AndroidStudio 插件, Danger 插件)比使用 Ktlint 有更好的开发体验, 而且一旦完成了格式化部分的设置和 Detekt 的基线, 规则等...Detekt 在质量报告方面更加完整, 而这正是linter的核心工作😇. 如果你已经有了完整的 ktlint 设置, 那么短期或中期内都不值得更换.