/ JITPACK, ANDROID, OPEN SOURCE

오픈 소스 라이브러리 쉽게 배포하기 - JitPack

안드로이드 스튜디오 도입과 함께 앱 빌드 과정에서 공식적으로 gradle을 사용하게 되었습니다. 이 과정에서 외부 라이브러리르 사용하는 양상도 라이브러리 프로젝트나 바이너리(jar 등)를 직접 프로젝트에 추가하는 방법에서 원격 저장소를 참조하는 방식으로 바뀌었습니다.

이러한 이유로, 이제 라이브러리 제작자들은 작성한 라이브러리를 배포할 때 바이너리 뿐 아니라 원격 저장소에도 함께 배포해야 합니다.

현재 널리 사용하는 원격 저장소는 Maven centralBintray jcenter가 있습니다. 여기에 라이브러리르 배포하면 대부분의 사용자들이 설정 변경 없이 라이브러리의 이름 및 버전을 추가하는 것 만으로도 자신의 애플리케이션에서 라이브러리를 사용할 수 있습니다.

하지만, 두 저장소 모두 바이너리를 저장소에 등록하기까지 거쳐야 하는 절차가 간단하지 않습니다. 경우에 따라서는 라이브러리르 개발에 준하는 수준의 추가 작업을 해야 등록을 할 수 있습니다.

그렇다면, 복잡한 절차 없이 원격 저장소로 라이브러리를 배포하는 방법은 정녕 없는 걸까요?

GitHub 저장소가 그대로 원격 저장소로?

JitPack을 사용하면 별도 설정 없이 GitHub 저장소의 주소를 원격 저장소로 사용할 수 있습니다.

GitHub 저장소 자체에 원격 저장소를 구축하는 것이 아니고 JitPack이 해당 저장소의 코드를 빌드 후 바이너리 형태로 제공해주므로, 대부분의 경우 라이브러리 개발자는 저장소에 별도 작업을 할 필요가 없습니다. (NDK도 지원합니다)

JitPack을 사용하여 GitHub 저장소의 프로젝트를 애플리케이션에서 사용하려면 다음 두 절차만 거치면 됩니다.

먼저, JitPack 저장소를 repository에 추가 (일반적으로 최상위 build.gradle 파일에 추가합니다)

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ...
}

allprojects {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" } // 이 주소를 추가합니다.
    }
}

다음으로, 추가할 라이브러리의 저장소를 다음과 같이 추가합니다.

android {
    ...
}

dependencies {
    compile 'com.github.{username}:{repository}:{tag}'
}

만약 저장소 주소가 github.com/kunny/my-awesone-lib 이고, 참조할 버전의 git 태그 이름이 0.10.0이라면 다음과 같이 입력하면 됩니다.

dependencies {
    compile 'com.github.kunny:my-awesome-lib:0.10.0'
}

사용하는 입장에서는 기존에 maven/jcenter를 사용하는 것과 큰 차이가 없고, 배포하는 입장에서도 태그만 잘 설정해 주면 기존과 동일한 경험을 제공할 수 있습니다.

안드로이드 라이브러리 배포시 참고 사항

Jitpack의 안드로이드 라이브러리 섹션에는 배포를 위해 android-maven 플러그인을 적용해야 한다고 나와 있으나, 확인 결과 별도 설정 없이 배포할 수 있었습니다.

단, 이 경우 배포되는 포맷은 무조건 aar로 고정됩니다. 따라서 jar 형태로 배포가 필요할 경우 별도 설정이 필요합니다.

설정 방법은 샘플 프로젝트의 빌드스크립트 후반부를 참고해 주세요.

여러 모듈로 구성된 프로젝트

여러 모듈로 구성된 프로젝트의 경우, JitPack에서 자동으로 이를 인식하여 다음과 같은 형식으로 참조할 수 있도록 지원합니다.

dependencies {
    compile 'com.github.{username}.{repository}:{module}:{tag}'
}

여러 모듈로 구성된 프로젝트의 예로 이미지 로드 라이브러리인 fresco의 커스텀 버전을 봅시다.

0.13.0 버전을 기준으로 커스텀이 필요한 부분을 적용한 후, 0.13.0 이라는 이름으로 태그를 생성해 두었습니다.

tag

이제, Fresco 공식 가이드에 나와 있는 방법과 유사하게, 필요한 모듈만 프로젝트에 추가할 수 있습니다.

다음은 기본 모듈과 gif 지원 모듈을 추가한 예를 보여줍니다.

dependencies {
    compile 'com.github.kunny.fresco:fresco:0.13.0'
    compile 'com.github.kunny.fresco:animated-gif:0.13.0'
}

위와 같이 dependency를 설정한 후 빌드를 수행하면 JitPack에서 자동으로 저장소에 있는 코드를 빌드하여 바이너리로 제공합니다.

즉, 특정 태그를 새로 생성하였다면 최초로 해당 버전을 요청하는 시점에 빌드를 수행하므로 시간이 다소 소요됩니다. (NDK 빌드까지 수행하는 Fresco는 약 8분 정도 소요되었습니다)

스냅샷 사용하기

스냅샷(SNAPSHOT)은 정식으로 릴리즈 되지 않은 버전을 테스트 할 때 유용합니다. 일반적으로 maven/jcenter에 배포되는 라이브러리 중 스냅샷을 제공하는 라이브러리는 버전 이름 뒤에 -SNAPSHOT을 붙여 정식 버전과 구분합니다.

JitPack에서는 다음과 같은 두 가지 방법으로 스냅샷을 지원합니다.

  • Commit hash: com.github.{username}:{repository}:{hash}
  • 브랜치 이름: com.github.{username}:{repository}:{branch}-SNAPSHOT

사용 예는 다음과 같습니다.

dependencies {
    // Commit hash 사용
    compile 'com.github.kunny.fresco:fresco:7fc2987'

    // 브랜치 이름 사용
    compile 'com.github.kunny.fresco:fresco:master-SNAPSHOT'
}

gradle은 원격 저장소에서 제공하는 바이너리를 캐시합니다. 하지만, 스냅샷은 특성상 버전 이름이 같다 할지라도 구현 내용이 계속 변할 수 있으므로 이를 캐시하지 않도록 설정해야 합니다.

빌드스크립트에 다음을 추가하면 gradle이 항상 최신 버전의 바이너리를 확인하도록 설정할 수 있습니다.

configurations.all {
    resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}

추가 참고할 만한 자료

kunny

커니

안드로이드와 오픈소스, 코틀린(Kotlin)에 관심이 많습니다. 한국 GDG 안드로이드 운영자 및 GDE 안드로이드로 활동했으며, 현재 구글에서 애드몹 기술 지원을 담당하고 있습니다.

Read More