2021년 4월 12일 월요일

Android Kotlin Lint 툴적용 & commit hook

팀으로 작업할때나 혼자서 작업할때나 바쁘게 코딩하다보면 들여쓰기, 괄호 등 엉망인 채로 commit 하는 경우가 있어서 코드리뷰때 발견되면 참 창피한 노릇이다.

그래서 정적분석도구 툴을 사용해서 현재 프로젝트의 소스코드에 컨벤션이 문제가 있나 체크를 하면 좋다. 나아가서는 팀원들이 커밋을 할때 commit hook 로 코드를 검사후 커밋이 가능하도록 하면 컨벤션 때문에 코멘트 달릴 일은 줄어들게 될거다.

팀으 클래스이름의 생성규칙, 별도의 코딩 룰도 체크할수 있다. 아래 내용을 참고하자

https://yunhos.blogspot.com/2021/11/kotlin-ktlint.html 


  1. 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"  
}
  1. ktlint, ktlintFormat 태스크는 gradlew 또는 Android Studio 의 오른쪽의 Gradle -> Tasks -> Verification -> ktlint 에서 실행해볼수 있다.
 ./gradlew ktlint
  1. 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
  1. 룰을 어긴 코드를 짜서 커밋 해보자.
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에서 해봐도 에러가 나온다.
enter image description here

에러대로 수정하고 다시 커밋하면 잘된다.

0 comments:

댓글 쓰기