ktlint는 프론트에서 사용하는 eslint 플러그인처럼 코틀린의 코드에 대해 lint규칙을 설정할 수 있는 모듈입니다.
코틀린은 공식 사이트에서 코딩 컨벤션 가이드를 제공하는데, ktlint는 공식 코딩 컨벤션 가이드와 일치하는 프로그래밍을 할 수 있도록 해 줍니다.
ktlint는 jar 파일로 제공되고, https://jcenter.bintray.com/ 에도 배포되어 있습니다.
따라서 별도의 Gradle plugin이 없어도 Gradle에서 task를 정의해서도 쓸 수 있습니다.
(그런데 ktlint의 공식 사이트에서는 Gradle plugin을 더 권장한다고 나와 있습니다)
ktlint는 .editorconfig 파일에 선언된 규칙을 포함하여 코드 스타일을 검사합니다.
.editorconfig 는 다양한 에디터와 IDE에서 공통적으로 지원하는 코드 스타일에 대한 설정 파일입니다.
기본으로 생선되는 파일이 아니니 root위치에 직접 만들어 사용합니다.
아래와 같이 .editorconfig 설정을 추가하면 됩니다.
.editorconfig 예시
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 120
tab_width = 4
[*.{kt,kts}]
disabled_rules=import-ordering
# java.* 패키지를 의존하는 경우 IntelliJ의 Orgarnize Import 기능으로는 알파벳 순서대로 import 구문을 정렬할 수 없다.
# 이는 ktlint의 import-ordering 규칙과 맞지 않는다.
사실 ktlint는 .editorconfig 파일이 없어도 디폴트 규칙으로 실행할 수 있지만 아래와 같은 이유로 edit파일을 만드는 것이 추천됩니다.
.editorconfig 파일의 규약에 따르면, 이 파일을 지원하는 도구들은 root = true 라는 선언이 된 .editorconfig 파일을 찾기 전까지는 모든 상위 디렉토리를 탐색합니다.
ktlint에서도 이 규약을 준수합니다. 따라서 특정 컴퓨터에만 소스를 복제한 디렉토리의 상위 디렉토리에 .editorconfig 가 있다면 그 장비에서는 스타일 체크 결과가 다르게 나오게 됩니다.
예를 들면 ktlint 0.34.0 버전부터 insert_final_newline = true 가 디폴트 값이 되었습니다.
IntelliJ, VSCode, GitHub등에서 뷰어,포멧터의 설정으로 자동 반영됩니다.
max_line_length , insert_final_newline 과 같은 규칙을 Kotlin 공식 코딩 컨벤션에는 명시되어 있지는 않습니다. 그러나 같은 소스를 고치면서 협업하는 개발자들이 이를 통일하지 않을 경우 불필요한 diff 가 발생하여 코드 변경분을 파악할 때 불편해집니다.
특히 현시점에서는 import-ordering 규칙은 쓰지 않는 것이 좋다고 합니다.
jlleitschuh/ktlint-gradle는 Gradle 버전 5.4.1이상에서만 사용할 수 있습니다. 그 이하 버전에서는 아래와 같은 에러가 나옵니다.
* What went wrong:
Could not determine the dependencies of task ':ktlintCheck'.
> Could not create task ':ktlintTestSourceSetCheck'.
> Could not create task of type 'KtlintCheckTask'.
> Could not generate a decorated class for class org.jlleitschuh.gradle.ktlint.KtlintCheckTask.
> org/gradle/work/InputChanges
이럴 경우에는 Gradle의 버전을 업그레이드해야합니다.
gradle.properites 파일에도 공식 코딩 컨벤션을 사용한다는 정책을 아래와 같이 명시합니다.
kotlin.code.style=official
./gradlew ktlintCheck
를 실행하거나 인텔리제이 우측 Gradle 탭에서 직접 실행합니다.
./gradlew ktlintFormat
를 실행하거나 인텔리제이 우측 Gradle 탭에서 직접 실행합니다.
Save Action Plugin을 사용하면 파일을 저장할 때 자동으로 포멧터를 실행할 수 있습니다.
File > Settings ( Ctrl + Alt + S ) > Plugins 메뉴로 이동합니다.
Marketplace 탭에서 'Save Actions' 로 검색합니다.
Save Actions' plugin의 상세 설명 화면에서 [Install] 버튼을 누릅니다.
IntelliJ를 재시작합니다.
File > Settings > Other Settions > Save Actions 메뉴로 이동합니다.
아래 항목(권장) 혹은 그 이외의 원하는 옵션을 체크합니다.
참고
https://blog.benelog.net/ktlint.html https://nesoy.github.io/articles/2018-09/Intellij-Auto-Convention https://sungjk.github.io/2021/12/17/ktlint.html https://blog.leocat.kr/notes/2020/12/14/intellij-avoid-wildcard-imports-in-kotlin-with-intellij