코틀린은 null safety(?.), not null operator(!!)를 지원합니다.
불필요한 null safety, not null operator을 사용하면, 안드로이드 스튜디오에서 이를 감지하고 알려주죠.
최근 이를 인지하지 못한 채 앱을 배포했다가, 핫픽스를 한 사례가 발생했습니다.
코드를 수정할 때 마다 수백개에 달하는 파일과 7만줄이 넘어가는 코드를 하나씩 찾아보기에는 시간과 비용이 너무 많이 듭니다.
CI가 이미 구축되어있는 프로젝트이기때문에, 파이프라인에 코드 분석을 끼워넣기 위해 SonarQube, CODEBEAT, ktlint, detekt를 모두 비교해보았고, 위 사례를 검출해주는건 detekt 뿐이었습니다.
detekt는 comments, complexity, coroutines, empty-blocks, exceptions, formatting, naming, performance, potential-bugs, style 항목의 룰이 있고, 불필요한 null safety, not null operator는 potential-bugs에 포함됩니다.
detekt를 사용하는 방법은 gradle task, detekt cli를 사용하는 방법으로 두가지가 있습니다.
하지만 gradle task로는 제가 원하는 UnnecessaryNotNullOperator
, UnnecessarySafeCall
을 검출하지 하고, detekt cli를 사용하되, --classpath, -cp
옵션을 추가해야만 검출됩니다.
안타깝게도 gradle task에는 cli 옵션을 추가할 수 없습니다.
따라서, detekt cli를 gradle task로 수행하는 task를 직접 만들게 되었습니다.
configurations {
detekt
}
task detekt(type: JavaExec) {
main = "io.gitlab.arturbosch.detekt.cli.Main"
classpath = configurations.detekt
def classpath = "$rootDir/app/src/main/kotlin"
def input = "$rootDir/app/src/main/kotlin"
def config = "$rootDir/detekt/config/detekt.yml"
def report = "xml:$rootDir/detekt/detekt.xml"
def params = ['-cp ', classpath, '-i', input, '-c', config, '-r', report]
args(params)
}
dependencies {
detekt("io.gitlab.arturbosch.detekt:detekt-cli:1.8.0")
}
cli가 있는데 왜 굳이 gradle을 사용하냐고 물으신다면, Jenkins로 보고서를 확인하기 위함입니다.
Jenkins 서버에 detekt cli를 설치하면 되지 않냐고 물으신다면, 어차피 안드로이드는 gradle에 의존하기 때문에, 의존성을 더 추가해서 버전에 구속받고싶지 않았습니다.
보다 정확한 cli 사용법은 아래 문서를 참고하시길 바랍니다.