본문 바로가기
안드로이드

[안드로이드] 멀티 모듈 공통 gradle 그리고 ktlint 적용을 해보자

by keel_im 2021. 4. 14.
반응형

정말 어느 날 그 어느날 buildSrc 에서 kotlin -dsl 에러 부터 힘든 시기를 지나 멀티 모듈은

제 머리에 들어와 혼란스럽게 합니다.

 

그러던 중 항상 gitub 에서 메일이 하나가 옵니다. 


이게 니가 관심이 있는 저장소 이지 않을까?


무심코 들어간 repo 에는 공통으로 작업한 gradle 을 동시에 적용한 모습을 보았습니다.

이걸 보고 나도 한번? 이라는 생각으로 적용을 해보았습니다. 

아이디어 자체는 심플합니다.

1. 공통으로 설정한 gradle 파일을 하나 만들어주자 (저는 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 미세한 차이? 가 느꼈졌고, 확실히 적용한 코드가 깔끔함을 알 수 있었습니다.

github.com/diffplug/spotless

 

diffplug/spotless

Keep your code spotless. Contribute to diffplug/spotless development by creating an account on GitHub.

github.com

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 로 변경해주세요

반응형

댓글