정말 어느 날 그 어느날 buildSrc 에서 kotlin -dsl 에러 부터 힘든 시기를 지나 멀티 모듈은
제 머리에 들어와 혼란스럽게 합니다.
그러던 중 항상 gitub 에서 메일이 하나가 옵니다.
이게 니가 관심이 있는 저장소 이지 않을까?
무심코 들어간 repo 에는 공통으로 작업한 gradle 을 동시에 적용한 모습을 보았습니다.
이걸 보고 나도 한번? 이라는 생각으로 적용을 해보았습니다.
아이디어 자체는 심플합니다.
1. 공통으로 설정한 gradle 파일을 하나 만들어주자 (저는 gradle 폴더에서 작성했습니다. )
import ProjectConfigurations
android {
compileSdkVersion ProjectConfigurations.compileSdk
buildToolsVersion ProjectConfigurations.buildTools
defaultConfig {
minSdkVersion ProjectConfigurations.minSdk
targetSdkVersion ProjectConfigurations.targetSdk
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled true
consumerProguardFiles 'proguard-rules.pro'
}
}
buildFeatures{
dataBinding true
viewBinding true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = '11'
}
}
apply from: "$rootDir/spotless.gradle"
android.gradle
2. 멀티 모듈에 적용을 해주자
- 이 부분은 심플하게 적용하고자 하는 모듈 gradle 파일에서
apply from: rootProject.file('./gradle/android.gradle')
추가해줍니다. 말 그대로 추가 입니다. 따로 dependencies 도 추가 가능합니다.
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
}
apply from: rootProject.file('./gradle/android.gradle')
dependencies {
implementation project(":data:api")
implementation project(":feature:error")
implementation SquareUp.timber
}
모듈에서 적용된 코드
여기까지는 뭐야 별거 없네 할 수 있습니다. 저도 쓰면서, 이게 뭐야;;; 했습니다.
하지만 spotless 를 같이 적용해준다면? (을 하기전에 ktlint 설명을 하겠습니다.)
항상 안드로이드 스튜디오에서 작업을 하면 ctrl+alt+l 을 늘상으로 누르곤 합니다. 하지만 저는 여태까지 이게 lint 가 당연히 맞겠지.. 라는 생각을 했습니다.
하지만 Github Repo 를 구경을 하면서 생각보다 ktlint 를 적용하는 repo 하고 적용안한 repo 미세한 차이? 가 느꼈졌고, 확실히 적용한 코드가 깔끔함을 알 수 있었습니다.
Spotless can format <antlr | c | c# | c++ | css | flow | graphql | groovy | html | java | javascript | json | jsx | kotlin | less | license headers | markdown | objective-c | protobuf | python | scala | scss | sql | typeScript | vue | yaml | anything> using <gradle | maven | anything>.
gradle 에서 이를 task 로 실행을 해서 자동으로 lint 를 맞춰 줄 수 있습니다. (저도 이제 사용을 시작을 해서 좀 더 자세한 내용이 있을 경우 더 수정을 하겠습니다.)
// 먼저 프로젝트 build.gradle 를 추가해 줍니다
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.0.0-alpha07'
classpath "com.diffplug.spotless:spotless-plugin-gradle:5.10.2"
}
}
저는 따로
파일을 생성을 하여서 관리를 하였습니다.
// Designed and developed by 2020 keelim (Jaehyun Kim)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
apply plugin: "com.diffplug.spotless"
spotless {
kotlin {
target "**/*.kt"
ktlint("0.39.0").userData(['indent_size': '2', 'continuation_indent_size': '2'])
licenseHeaderFile "$rootDir/spotless.license.kt"
trimTrailingWhitespace()
endWithNewline()
}
}
위와 같이 적용을 할 수 있으며 자세한 옵션들은 repo 에서 확인하시면 좋습니다. 저는 indent 를 특별히 신경을 쓰지는 않지만 공백을 없애주거나 새줄을 추가하는 옵션들은 정말 좋은 것 같습니다.
그리고 app/build.gradle 이나 서브 프로젝트에 build.gradle 에서 적용을 시켜주어야 하는데
맨 아래에 추가를 해주었습니다. 그러면 모듈에서 전부 적용을 할 수 있습니다.
여기까지 설정이 전부 완료 되었습니다.
사용법
2가지 명령어 실행할 수 있습니다. (너무나 간단한 것) (gradlew 입니다)
- spotlessCheck 변경될 부분을 찾아서 미리 보여주는 명령입니다
- spotlessCheck 변경을 시켜 줍니다.
여기까지가 ktlint 기본 설명이었습니다.
다시 주제로 넘어가 멀티 모듈과 같이 적용을 해주면 저희가 맨 처음 공통으로 작성한 android.gradle 에서 spotless 를 적용해준다면 android.gradle 을 적용한 모든 곳에서 적용할 수 있습니다.
import ProjectConfigurations
android {
compileSdkVersion ProjectConfigurations.compileSdk
buildToolsVersion ProjectConfigurations.buildTools
defaultConfig {
minSdkVersion ProjectConfigurations.minSdk
targetSdkVersion ProjectConfigurations.targetSdk
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled true
consumerProguardFiles 'proguard-rules.pro'
}
}
buildFeatures{
dataBinding true
viewBinding true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = '11'
}
}
apply from: "$rootDir/spotless.gradle"
마무리
여러가지 좋은 옵션들이 있으니 활용하시면 너무나 좋을 것 같습니다. 특히, 혼자 작업하는게 아니니까 ㅎㅎㅎ
안드로이드 뿐만 아니라 개발을 할 때 정말 필요한 툴이라고 개인적으로 생각합니다. 많은 참고가 되셨으면 좋겠습니다.
사용후기
- 가끔 Wildcard 에러가 나는데 해당 부분에 Wilcard import 를 수정해주시면 됩니다. 저는 java,util.* 에서 에러가 많이나서 java.util.ArrayList로 많이 고쳤네여
- 그래서 생각한 방법이 android studio 설정 부터 wildcard import 를 막는 방법을 사용했습니다.
Editor > Code Style > Java(Kotlin) > Imports >에서 single 로 변경해주세요
'안드로이드' 카테고리의 다른 글
[안드로이드] Android Studio 2021.1.1 Canary Bumblebee gradle error (0) | 2021.05.30 |
---|---|
[안드로이드] 앱 오프닝 광고 구현 [최근 업데이트] (0) | 2021.04.18 |
[안드로이드] Firebase Distribution 사용하기 (0) | 2021.03.29 |
[안드로이드] Hi! Compose (0) | 2021.03.01 |
[안드로이드] Github Actions으로 구글 플레이스토어 배포 (2) | 2021.02.17 |
댓글