drcarter의 DevLog

android library를 만들고 배포할려면 maven repository가 필요한데, 이게 준비가 되어 있지 않다면 aar파일을 직접 전달해야 하는 번거러움이 있습니다. 그런데 github packages에 apache maven을 지원해주기에 간단하게 aar library를 배포하여 사용할 수 있습니다.

github packages에 대한 설명은. 해당 링크로..

github - personal access tokne 생성

github의 자신의 계정에서 Settings-> Developr settings -> Personal access tokens 으로 가서 access token을 생성 합니다.
write packages, read packages 를 체크 합니다.

properties

project의 root 위칭에 github.properties 를 만들고 그 안에
github에서의 username과 access token생성한 것을 적용해 줍니다.
그리고 해당 파일은 github에 올라가지 않도록 .gitignore 에 추가해 주는 것이 좋습니다. 보안상...

github_username={username}
github_access_token={access_token}

Publish script

library module에 있는 위치에 publish.gradle 를 만듭니다.
그리고 그 안의 내용에는

apply plugin: 'maven-publish'

def githubProperties = new Properties()
githubProperties.load(new FileInputStream(rootProject.file("github.properties")))

def LIB_GROUP_ID = {library_group_id}
def LIB_ARTIFACT_ID = {artifact_id}
def LIB_VERSION = {version_name}

task sourceJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier "sources"
}

publishing {
    repositories {
        maven {
            name = 'GithubPackages'
            url = uri("https://maven.pkg.github.com/{user_name}/{project_name}")
            credentials {
                username = githubProperties['github_username'] ?: System.getenv("github_username")
                password = githubProperties['github_access_token'] ?: System.getenv("github_access_token")
            }
        }
        maven {
            name = 'CustomMavenRepo'
            url = "file://${buildDir}/repo"
        }
    }
    publications {
        deploy(MavenPublication) {
            groupId LIB_GROUP_ID
            artifactId LIB_ARTIFACT_ID
            version LIB_VERSION
            artifact("$buildDir/outputs/aar/${aar_library_name}.aar")
            artifact(sourceJar)

            pom.withXml {
                def dependenciesNode = asNode().appendNode('dependencies')

                //Iterate over the compile dependencies (we don't want the test ones), adding a <dependency> node for each
                configurations.api.allDependencies.each {
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', it.group)
                    dependencyNode.appendNode('artifactId', it.name)
                    dependencyNode.appendNode('version', it.version)
                }
            }
        }
    }
}

그리고 나서, library project에 있는 build.gradle 에 아래와 같이 추가해 줍니다.

apply from: file('publish.gradle')

이와 같이 추가하고 나면

그림과 같이 gradle에 publishing 에 대한 부분이 생깁니다.

library를 build후 publishDeployPublicationToCustomMavenRepoRepository 하고 나면, local repo에 배포가 되는 부분을 확인할 수 있습니다.

실질적으로 배포를 할려면 publishDeployPublicationToGithubPackagesRepository 로 하면 github의 지정된 username/project의github packages에 배포가 되게 됩니다.

library 사용

root에 있는 build.gradle 에 다음과 같이 repositories에 추가해 줍니다.

def githubProperties = new Properties()
githubProperties.load(new FileInputStream(rootProject.file("github.properties")))

repositories {
        google()
        jcenter()

        mavenLocal()
        maven {
            name = {maven_repository_name}
            url = uri("https://maven.pkg.github.com/{user_name}/{project_name}")
            credentials {
                username = githubProperties['github_username'] ?: System.getenv("github_username")
                password = githubProperties['github_access_token'] ?: System.getenv("github_access_token")
            }
        }
    }

그리고 application 에 있는 build.gradle 에 maven repository에 있는 library 사용할 때 처럼.

implementation '{library_group_id}:{artifact_id}:{version}'

으로 해서 사용하면 됩니다.

maven repository를 만들고 관리하는 것 또한 비용인데, 이걸 github packages를 이용한다면 간단히 해결되는 것 같습니다.