깔끔한 포맷팅을 위한 ktlint 적용하기 (feat. kotlin)
안녕하세요 😉
유유자적한 개발자 유로띠 입니다 😀
이번 포스팅에서는
✅ ktlint 설치해서 설정하기
✅ ktlint - gradle 설정하기
✅ ktlint with gitAction
에 대해서 알아보겠습니다
👏👏👏👏
🎉 Ktlint
klint는 kotlin 언어의 공식 코딩 컨벤션에 따라
이를 준수할 수 있도록
스타일을 검사해 주는 도구입니다.
최근 클린코드를 읽고 있는데
포맷팅 맞추는 것은
아주 중요한 일입니다. 😄
🚀 ktlint 설치해서 설정하기
사용법은 여러 가지가 있는데
가장 간단한 것은 설치해서 사용하는 방법입니다.
✅ ktlint installation
brew를 사용하여 설치하고 M1의 경우 설치 방법이 살짝 다르니 주의해서 설치합니다. 👀
$ brew install ktlint
// mac M1
$ arch -arm64 brew install ktlint
✅ ktlint 사용하기
ktlint 명령어를 입력하면 스타일 검사를 진행합니다.
$ ktlint "src/**/*.kt"
*.kt 파일을 검사하여 잘못된 파일과 결과를 볼 수 있습니다.
엄청난 스타일 오류를 뿜고 있네요..
ktlint --help를 입력하면 사용법과 예시가 나오니 필요한 부분은 확인하시어 사용하면 됩니다.
$ ktlint --help
An anti-bikeshedding Kotlin linter with built-in formatter.
(https://github.com/pinterest/ktlint).
Usage:
ktlint <flags> [patterns]
java -jar ktlint.jar <flags> [patterns]
Examples:
# Check the style of all Kotlin files (ending with '.kt' or '.kts') inside
the current dir (recursively).
#
# Hidden folders will be skipped.
ktlint
# Check only certain locations starting from the current directory.
#
# Prepend ! to negate the pattern, KtLint uses .gitignore pattern style
syntax.
# Globs are applied starting from the last one.
#
# Hidden folders will be skipped.
# Check all '.kt' files in 'src/' directory, but ignore files ending with
'Test.kt':
ktlint "src/**/*.kt" "!src/**/*Test.kt"
# Check all '.kt' files in 'src/' directory, but ignore 'generated' directory
and its subdirectories:
ktlint "src/**/*.kt" "!src/**/generated/**"
# Auto-correct style violations.
ktlint -F "src/**/*.kt"
# Using custom reporter jar and overriding report location
ktlint --reporter=csv,artifact=/path/to/reporter/csv.jar,
output=my-custom-report.csv
🚀 ktlint gradle 설정하기
설치하여 사용하는 방법도 있지만
현업에서는 gradle에 의존성을 추가하여
사용하는 편이 좋겠습니다. ☺️
✅ klint-gradle
많이 사용되고 있는 jlleitschuh-gradle-ktlint로 설정합니다.
사용법은 공식 사이트에 나와있는 대로 작성하면 됩니다.
plugins {
id("org.jlleitschuh.gradle.ktlint") version "<current_version>"
}
ktlint-idea 플러그인은 ktlint에 의해 자동으로 적용된다고 하여 생략 가능합니다.
plugins {
id("org.jlleitschuh.gradle.ktlint-idea") version "<current_version>"
}
최신 버전 정보는 gradle-plugins에서도 찾아볼 수 있었습니다.
현재 기준(22.01.26)으로 최신 버전인 10.2.0을 설정하였습니다.
plugins {
id("org.jlleitschuh.gradle.ktlint") version "10.2.0"
}
✅ .editorconfig 설정
ktlint는 기본적으로 코틀린 공식 가이드에 있는 문서를 기준으로 coding conventions를 따르는 Standard rules을 따릅니다.
그러나, ktlint는 버전에 따라 rules이 변할 수도 있기에 .editorconfig 파일을 생성하여 해당 설정을 기준으로 스타일을 검사하는 것을 권장합니다.
.editorconfig 파일 작성법은 Editorconfig를 참조하면 됩니다.
저는 아래처럼 설정하였습니다.
root = true
[*]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 4
insert_final_newline = true
max_line_length = 120
tab_width = 4
disabled_rules = no-wildcard-imports,import-ordering,comment-spacing
자 그럼
ktlint를 사용해보도록 하겠습니다.
✅ ktlintCheck
코드의 스타일을 검사하거나 자동으로 틀린 부분을 수정해주기도 합니다.
# 코드 스타일 검사
$ ./gradlew ktlintCheck
테스트를 위해 ktlintCheck를 진행하였습니다.
기본적인 컨벤션 이외에 .editorconfig에 설정한 max_line_length=120 line 이 넘는 error도 올바르게 검사하는 것을 알 수 있습니다.
✅ ktlintFormat
코드의 스타일 검사 후 자동으로 틀린 부분을 수정합니다.
# 코드 스타일 검사 후 틀린 부분을 자동으로 수정합니다.
$ ./gradlew ktlintFormat
✅ addKtlintCheckGitPreCommitHook
pre-commit hook을 등록할 수 있습니다.
$ ./gradlew addKtlintCheckGitPreCommitHook
git commit을 진행할 때 자동으로 ktlintCheck를 하여 맞지 않는 경우 error를 발생합니다.
올바른 코드 스타일 검사를 진행하면 정상적으로 commit이 완료됩니다.
💡 등록한 hook을 삭제하고 싶다면? 🧐
hooks 경로로 이동 후 pre-commit을 삭제하시면 됩니다.
$ cd .git/hooks
$ rm ./pre-commit
🚀 ktlint with gitAction
팀에서 협업하여 관리하기 위해서는
github의 gitaction을 만들어 관리하는 것이 좋겠죠? 🙋♂️
gitAction을 만들어서 특정 브랜치에
pull request가 발생하면
ktlint을 실행하여 스타일 검사 후
성공인 경우 병합되도록 설정해 봅니다.
✅ git action
git hub의 Marketplace에서 ktlint를 검색하면 다양한 git Action 정보가 나옵니다.
보통 스타가 많은 것을 사용하거나 원하시는 action을 선택하여 사용하면 됩니다.
저는 스타가 가장 많은 Run ktlint with reviewdog 사용해 보겠습니다.
✅ ktlint-check.yml
git action 파일은 해당 디렉토리에 생성합니다.
.github/workflows/ktlint-check.yml
나와있는 Example usage를 따라 작성해 줍니다.
동일하게 작성하면 되는데 저는 특정 브랜치(main, develop)에 pull request를 요청할 때 확인하도록 옵션을 넣었습니다.
name: ktlint
on:
pull_request:
branches:
- main
- develop
jobs:
ktlint:
name: Check Code Quality
runs-on: ubuntu-latest
steps:
- name: Clone repo
uses: actions/checkout@master
with:
fetch-depth: 1
- name: ktlint
uses: ScaCap/action-ktlint@master
with:
github_token: ${{ secrets.github_token }}
reporter: github-pr-check # Change reporter
reporter 방식은 github-pr-check / github-pr-review 두 가지 방식이 있습니다.
📍github-pr-check
📍github-pr-review
스타일은 안 맞춘 코드가 올라간다면 엄청난 review가 생기기 때문에 저는 github-pr-check 방식으로 하였습니다. 😏
❌ 일부러 실패를 하기 위해 등록해 둔 hook을 삭제 후 PR을 올려보겠습니다.
관련 PR에서 Checks 탭으로 이동하여 확인을 하면 다음과 같이 실패한 파일 위치를 확인할 수 있습니다.
테스트와 스타일 검사에 성공하면
다음과 같이 Merge를 진행 할 수 있습니다.
이상
kotlin 스타일 검사 도구
ktlint
입니다.
💡 참고
https://cheese10yun.github.io/ktlint/
https://blog.benelog.net/ktlint.html
https://zion830.tistory.com/119