ktlint & git hook 로 코딩규칙 잘 지키기
ktlint & git hook 로 코딩규칙 잘 지키기
- 팀만의 특정 룰을 좀더 상세하고 정하고 사용하고자 할떄는 https://yunhos.blogspot.com/2021/11/kotlin-ktlint.html 를 참고하자.
팀으로 작업할때나 혼자서 작업할때나 바쁘게 코딩하다보면 들여쓰기, 괄호 등 엉망인 채로 commit 하는 경우가 있어서 코드리뷰때 발견되면 참 창피한 노릇이다.
그래서 정적분석도구 툴을 사용해서 현재 프로젝트의 소스코드에 컨벤션이 문제가 있나 체크를 하면 좋다. 나아가서는 팀원들이 커밋을 할때 commit hook 로 코드를 검사후 커밋이 가능하도록 하면 컨벤션 때문에 코멘트 달릴 일은 줄어들게 될거다.
- ktlint 는 gradle에서 task 단위로 실행되도록 해놓는게 편하니까 build.gradle(Module:xxx) 에 다음과 같이 추가하자.
android {
...
configurations {
ktlint
}
// ktlint 로 검사만 하는 태스크
task ktlint(type: JavaExec, group: "verification") {
description = "Check Kotlin code style."
classpath = configurations.ktlint
main = "com.pinterest.ktlint.Main"
args "src/**/*.kt", "android", "--reporter=plain", "--reporter=checkstyle,output=${buildDir}/reports/ktlint/ktlint-result.xml"
ignoreExitValue true
}
// ktlint 로 검사후 코딩컨베션을 수정까지 해주는 태스크
task ktlintFormat(type: JavaExec, group: "formatting") {
description = "Fix Kotlin code style deviations."
classpath = configurations.ktlint
main = "com.pinterest.ktlint.Main"
args "-F", "src/**/*.kt", "android", "--reporter=plain", "--reporter=checkstyle,output=${buildDir}/reports/ktlint/ktlint-result.xml"
ignoreExitValue true
}
}
dependencies {
...
ktlint "com.pinterest:ktlint:0.36.0"
}
- ktlint, ktlintFormat 태스크는 gradlew 또는 Android Studio 의 오른쪽의 Gradle -> Tasks -> Verification -> ktlint 에서 실행해볼수 있다.
./gradlew ktlint
- git 에 commit 할때 ktlint 로 코드규칙을 잘 준수했는지 검사하도록 강제해보자.git 에서 commit또는 push할때 뭔가 처리를 하고 싶으면 hook(갈고리) 파일을 이용해서 하고싶은 작업을 적어넣으면 된다. 우린 ./gradlew kotlin 을 실행하고 결과가 실패하면 commit안하도록 하자.
.git/hooks/pre-commit 파일을 없으면 만들어서 아래처럼 적자.
#!/bin/sh
echo "ktlint start"
./gradlew ktlint
status=$?
if [ "$status" = 0 ] ; then
echo "No Issue"
exit 0
else
echo 1>&2 "Issue Found"
exit 1
fi
- 룰을 어긴 코드를 짜서 커밋 해보자.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
}
}
에러가 출력되고 실패가 뜬다.
> Task :app:ktlint FAILED
/Users/hehe/app/src/main/java/com/example/myapplication/MainActivity.kt:9:1: Unexpected indentation (15) (it should be 8) (cannot be auto-corrected)
"checkstyle" report written to /Users/hehe/app/build/reports/ktlint/ktlint-result.xml
Execution failed for task ':app:ktlint'.
> Process 'command '/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java'' finished with non-zero exit value 1
SourceTree에서 해봐도 에러가 나온다.
에러대로 수정하고 다시 커밋하면 잘된다.
0 comments:
댓글 쓰기