Kotlin Multiplatform Library with Composite Build

이태훈·2022년 9월 29일
0

안녕하세요, 오늘은 기존에 존재하는 어플에 KMM Library를 붙여볼겁니다.

KMM Library는 다음과 같은 방법들로 기존의 어플에 붙일 수 있습니다.

  • 링크와 같이 싸그리 뭉퉁그려 묶어서 메인 빌드와 같이 포함시키는 방법
  • Composite 빌드를 통해 독립적인 프로젝트 구성
  • 레포지토리에 배포 후 앱에서 사용

이 방법들 중 저는 Composite Build를 통해 기존 앱에 붙여보겠습니다.

프로젝트를 sdk 형태로 배포하는데, KMM Library를 프로젝트에 모듈로 붙이고 배포를 하니 KMM에서 gradle script에서 target 설정하는 쪽에 에러가 발생해서 Composite Build를 통해 독립적인 빌드를 구성하는 방향으로 틀어서 해결했습니다.

이 과정을 공유해보겠습니다.

음 우선 독립적인 프로젝트를 생성하고 이 프로젝트를 레포에 올린 후 앱 프로젝트에서는 깃 서브모듈로 관리해주는 방향으로 하겠습니다.

KMM Library 생성

AGP 버전 맞추기

AGP 버전이 맞지 않을 경우 빌드는 정상적으로 뜨지만 failed to resolve 프로젝트 라는 워닝이 계속 뜹니다.

이를 해결하기

build.gradle 작성

똑같이 gradle을 작성해주시면 됩니다. ios target을 직접 설정해줘야 하는 이슈가 있긴한 것 같은데 최신 릴리즈에서는 해결된 것 같고, 이슈가 생기시는 분은 링크를 확인하시면 될 것 같습니다.

plugins {
    kotlin("multiplatform") version "1.7.10"
    id("com.android.library")
}

repositories {
    google()
    mavenCentral()
}

kotlin {
    android()
    ios()
    sourceSets {
        val commonMain by getting
        val androidMain by getting
        val iosMain by getting {
            dependsOn(commonMain)
        }
    }
}

android {
    compileSdk = 32
    sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
    defaultConfig {
        minSdk = 21
        targetSdk = 32
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
}

App Project 생성

settings.gradle 작성

groovy script 버전과 kotlin script 버전을 나누어 보여드리겠습니다.
공통적인 부분은 kmm library의 경우 dependency substitution을 정의해줘야 합니다.

pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}

include ":app"
includeBuild("sample-composite-library") {
	dependencySubstitution {
    	substitue module("com.example.composite:library") using project(":")
    }
}
pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}
include(":app")
includeBuild("sample-composite-library") {
    dependencySubstitution {
        substitute(module("com.example.composite:library")).using(project(":"))
    }
}

dependency 적용

그런 다음 해당 프로젝트를 사용하고 싶은 모듈에 가서 dependency에 추가해주시면 됩니다.

  • implementation "com.example.composite:library" // kotlin script
  • implementation("com.example.composite:library") // groovy script

전체 코드 : https://github.com/TaehoonLeee/sample-composite-application

profile
https://www.linkedin.com/in/%ED%83%9C%ED%9B%88-%EC%9D%B4-7b9563237

0개의 댓글