Spotless 是什么?
这是一个代码格式化东西,咱们能够定义自己想要的代码规矩在需求的时候去运用它,整个进程彻底主动且能够运用于整个工程。
Spotless 支撑多种言语:c、c++、java、kotlin、python 等等更多,运用广泛的开发言语根本都支撑。
插件丰富,支撑 Gradle、Maven、SBT。并且有 IDE 插件,如:VS Code、Intellij。
社区活泼,许多优异的开源贡献者,如:ktlint、ktfmt、prittier 等, Github 上的提交经常是几天前。
为什么要用 Spotless?
编写代码时咱们都期望遵从固定的代码风格,咱们运用的 IDE 也都有代码格式化功能。可是很遗憾,代码格式化都需求开发者手动触发,所以你肯定会有忘掉格式化的时候。 假如你的团队有 code review 的进程,你的小伙伴或许能纠正这些问题,当然,也有或许看不到,某段代码就这样”脏“了。
尽管杰出、一致的代码风格并不能进步代码功能,即使代码风格很糟糕代码也能正确编译,且运转成果并无二致。可是当你的代码有杰出一致风格时,代码会更美观,有更好的阅读性,小伙伴 code review 时能够彻底不必重视代码风格。
而 [Spotless](diffplug/spotless: Keep your code spotless (github.com)) 便是这样一个能让你不必重视代码风格的东西,由于它会主动帮你格式化代码。
项目整合
Gradle 装备
首先在 project build.gradle
中添加 Spotless 插件
classpath "com.diffplug.spotless:spotless-plugin-gradle:$spotless_version"
然后在 project 或 module 的 build.gradle
中做如下装备
apply plugin: 'com.diffplug.spotless'
spotless {
java{
target 'src/*/java/**/*.java'
googleJavaFormat()
}
kotlin {
target 'src/*/java/**/*.kt'
ktlint('0.43.2')
}
format 'misc', {
target '**/*.gradle', '**/*.md', '**/.gitignore'
}
format 'xml', {
target '**/*.xml'
}
}
完毕了,便是这么简略,你需求的仅仅是去装备你想要的代码规矩。详细规矩装备请参阅 [Spotless GitHub](spotless/plugin-gradle at main diffplug/spotless (github.com))
Java (google-java-format, eclipse jdt, clang-format, prettier, palantir-java-format, formatAnnotations)
Kotlin (ktfmt, ktlint, diktat, prettier)
Spotless gradle task
运用 Spotless 十分简略,一般咱们只需求运用两个 task
./gradlew spotlessCheck
履行 spotlessCheck
能够校验代码风格,假如有问题会报错并列出反常代码的方位
./gradlew spotlessApply
履行 spotlessApply
能够在全工程范围内主动修正代码不合规的地方。不过它只能格式化代码,假如规矩需求修改代码,比如要删除某个导入的包是需求手动操作的。
从以上两步操作:装备、履行,能够看到 Spotless 的依赖本钱是十分低的,运用也十分简略。它带来的好处在我看来有两点:
- 确保全工程代码风格一致,且是遵从官方代码风格标准
- 开发者编码阶段彻底不需求关怀代码风格问题,也不会在 review 阶段花时间更正代码风格,只重视业务价值本身
所以假如你或你的团队在重视代码风格问题,那么 Spotless
一定适合你,请测验运用吧!
关于 Android 开发最关怀的便是 java 和 kotlin 了,这两个言语都有十分多的代码标准支撑,不过运用较多的是 Java「google-java-format」
和 kotlin「ktlint」
。跟着 kotlin 在 Android 开发的占比添加,kotlin 的代码标准就显得更受重视,并且假如你重视 Google 的官方源码,你会发现 Google 的这些工程大多都是运用 ktlint 束缚代码风格,这是由于 ktlin 同时支撑 official Kotlin coding conventions 和 Android Kotlin Style Guide 两种风格,Android 开发者能够用 ktlint 便利的遵从 Google 代码风格。
更多 ktlint
内容请重视 [ktlint](Ktlint (pinterest.github.io))。
Android Studio lint 插件
前文提到的 google-java-format
、ktlint
是都有 IDE 插件的,能够在 plugins market
中装置。
个人现在开发比较少涉及到 java ,所以 AS 并没有装置 google-java-format
,有 java code format 的开发者能够在市场中装置此东西。下面我简略介绍下 AS ktlint 插件的运用体会。
比如此处多了一个空行,ktlint 会醒方针红,鼠标移过去会展现可操作的选项,能够选择 ktlint format 或禁用此规矩。
装置插件后 AS 会添加一个菜单 Refactor -> Format With Ktlint
,此菜单能够格式化整个文件,就与 AS 的格式化操作一样,你也能够为 Format With Ktlint
指定快捷键,操作会更便利。
在 ktlint 的 gradle 、AS 插件加持下,信任代码风格在开发中不需求特别花时间去向理了。假如代码风格不正确首先是 AS 的 error 夺目提示,假如看到了能够一键修正。假如看不到,在履行 ./gradlew spotlessApply
之后还能够全工程修正,让“脏”代码无所遁形。
Git hooks
上文介绍的装备,或许现已满意许多人了,不过仍是有人会觉得,只要是手动操作的内容,那一定会有或许会忘掉,有没有不需求手动操作的格式化操作。
有的有的,计划便是本小结标题 Git hooks
。Ktlint 官网有一键装置 git hooks
的操作,能够参阅 [ktlint git hooks](Command line – Ktlint (pinterest.github.io))。
关于 git hooks 是什么能够参阅这篇博文: [git hooks 简介与运用](git hooks 简介与运用 – 简书 (jianshu.com))
不过这个需求每个人都要手动去操作,其实咱们能够把 git hooks 脚本文件放到咱们工程里,然后经过 gradle 将脚本文件复制至 .git 目录
首先在项目下新建hooks
目录,新建pre-commit
文件:
#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments. The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".
./gradlew spotlessCheck
result=$?
printf "the spotlessCheck result code is $result"
if [[ "$result" = 0 ]] ; then
echo "\033[32m
....
....
SpotlessCheck Pass!!
....
....
\033[0m"
exit 0
else
./gradlew spotlessApply
echo "\033[31m
....
....
SpotlessCheck Failed!!
代码格式有问题;
....
现已主动调整格式,review代码后再git add . && git commit
....
....
\033[0m"
exit 1
fi
pre-commit
脚本能够根据自己需求作调整,这边仅仅是一个示例。
下一步需求将此文件复制至项目目录下 .git/hooks
目录,能够用 gradle 来处理复制事情。
task copyHooks(type: Copy) {
println 'copyHooks task'
from("hooks") {
include "**"
}
into ".git/hooks"
}
履行此 task 就能够将项目 hooks
目录内容复制至 .git
完成上述操作之后,在每次履行 git commit
之前都会先履行 pre-commit
,在校验失利后会主动格式化代码,开发者在 reivew 之后再从头提交。
总结
假如你在开发进程中时不时会由于代码格式化问题形成困扰,那 Spotless 及 ktlint 会彻底解放你。让你无需重视代码格式的同时也能确保代码风格的一致。
ktlint 的优异远不止此篇文中所述,这仅仅是一篇辅导文,我们能够去探索更适合自己项目的方法。
期望此文能让我们了解 Spotless 并测验运用,谢谢!