이번 포스트에서는 Android, Spring 혹은 다른 Gradle 빌드 시스템을 사용하는 프로젝트에서 외부 모듈을 불러오는 방법을 알아보겠습니다.
외부 저장소에서 라이브러리를 불러올 때의 문제점
안드로이드는 공식 빌드 도구로 Gradle
을 사용합니다.
라이브러리를 불러와 빌드 구성을 할 때에는 Gradle 빌드 시스템 상의 module 수준의 빌드 파일에서 수행되며 jitpack, maven central같은 외부 저장소에서 implementation 키워드를 통해서 불러올 수 있습니다.
하지만, 위와 같이 외부저장소에서 라이브러리를 불러오는 경우에는 당연하게도 외부 저장소에 있는 소스코드이다보니 라이브러리를 즉각적인 수정을 하여 사용하기에는 무리가 있을 수 있습니다.
이러한 상황을 해결하기 위한 방법은 여러가지가 있습니다.
해결법은 간단한데, 해당 라이브러리를 외부 저장소에서 불러오는 것이 아닌 로컬에 있는 모듈을 프로젝트에 직접 Import 하여 모듈에 대해 즉각적으로 수정하는 것입니다.
대표적인 방법으로는 Git을 이용한 서브 모듈(sub module)
을 프로젝트내에 불러와서 사용하는 방법이 존재합니다.
물론, 서브 모듈도 좋은 방법 중에 하나지만, 사내에 여러 모듈이 존재한다면 전부 서브 모듈로 불러와서 사용하기에는 다소 무리가 있을 수 있습니다. (서브 모듈도 좋은 방법이고 실제로 많이 사용합니다!)
또, 간단한 방법 중 하나는 Gradle 시스템 상에서 외부 모듈을 직접 불러와서 사용하는 방법이 있습니다.
그래서 이번에는 Gradle 빌드 시스템 상에서 외부 모듈을 직접 모듈을 불러오는 방법을 정리하겠습니다.
Gradle 빌드 프로젝트에 외부 모듈 불러오기
tcpsocketlibrary라는 라이브러리를 사용하고 이 라이브러리를 불러온다고 가정을 하고 진행하겠습니다.
Project 수준의 settings.gradle 파일에 모듈 추가
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
rootProject.name = "ExampleApp"
include ':app'
// 추가!!
include ':tcpsocketlibrary'
project(':tcpsocketlibrary').projectDir = new File("../tcpsocketlibrary") // 라이브러리의 경로를 입력해줍니다.
// project(':tcpsocketlibrary').projectDir = new File(LIBRARY_PATH)
프로젝트 수준의 settings.gradle
파일에 tcpsocketlibrary를 include 해줍니다.
이 때, projectDir에는 저장되어있는 라이브러리의 경로를 설정해 주시면 됩니다.
프로젝트 속성 파일 Project properties에 PATH를 변수로 지정
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app"s APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official
# Enables namespacing of each library's R class so that its R class includes only the
# resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true
kotlin_version = "1.6.10"
// 변수로 지정하고 싶다면 추가!!
LIBRARY_PATH=/Users/seunghwan/TcpSocketLibrary
만약, 라이브러리의 PATH를 변수로 만들어 사용하고 싶다면 gradle.properties(Project properties 혹은 Global properties)
에 PATH를 지정하여 사용하시면 됩니다.
모듈 수준 빌드 파일 build.gradle에 dependency 추가
plugins {
id 'com.android.library'
id 'org.jetbrains.kotlin.android'
}
android {
compileSdk 32
defaultConfig {
minSdk 22
targetSdk 32
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = '11'
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.5.1'
implementation 'com.google.android.material:material:1.6.1'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
// 라이브러리 의존성 추가!!
// implementation project('모듈명')
implementation project(':tcpsocketlibrary')
}
모듈 수준의 build.gradle
파일에 implementation project('모듈명')을 통해서 settings.gradle에 추가해 주었던 라이브러리의 의존성을 추가해주시면 모듈이 정상적으로 import 되는 것을 볼 수 있습니다.
이제 외부 저장소에서 라이브러리를 가져오는 것과 다르게 라이브러리를 수정하는 것이 가능해 졌으므로 라이브러리를 더 유연하게 사용할 수 있게 됩니다.