노블의 개발이야기

Bintray(jCenter)에 Android Library(.aar)을 배포 본문

Android

Bintray(jCenter)에 Android Library(.aar)을 배포

더플러스 2017. 7. 20. 21:15

jCenter는 Bintray에서 운영 중인 Maven Repository 입니다.

1. Sign up to Bintray

Bintray 홈페이지는 무료로 가입이 가능합니다.

서비스 이용은 개인일 경우 모두 오픈 조건으로 무료로 사용 가능합니다.

회사 또는 private을 원하는 사용자를 위한 유료 서비스도 추가 제공됩니다.

가격 정보 및 서비스 조건은 Bintray pricing에서 확인 가능합니다.

2. Apply the plugin to your Gradle build script

jCenter 또는 Maven Central에 배포하기 위해서는 Plugin을 dependencies에 추가해야합니다.


buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3'
    }
}
apply plugin: 'com.jfrog.bintray'
  • Maven Plugin
buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
    }
}

apply plugin: 'com.github.dcendents.android-maven'

3. Add the bintray configuration closure to your build.gradle file

다음과 같이 group, version을 정의합니다.

group = 'com.shnoble.module'
version = '1.0.0'

위와 같이 정의하지 않으면 unspecified로 표시됩니다.



자격 증명


배포하고자 하는 Library의 build.gradle 파일에 ‘bintray’ 클로저를 추가합니다.

bintray {
    user = 'bintray_user'
    key = 'bintray_api_key'
    ...
}
  • Parameter 설명

  •  Parameter

     Description

     user

     Bintray 회원 가입 시 작성한 Username

     key

     Bintray에서 제공하는 API Key

    [Your Profile] -> [Edit]
  • 스크립트에서 Bintray 자격 증명을 명시적으로 정의하지 않고 환경 변수 또는 외부 사용자 속성에 저장하고 다음과 같이 사용할 수 있습니다.
bintray {
    user = System.getenv('BINTRAY_USER')
    key = System.getenv('BINTRAY_KEY')
    ...
}

또는

bintray {
    user = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER')
    key = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY')
    ...
}

publish

bintray {
    user = 'bintray_user'
    key = 'bintray_api_key'
    publish = true // [Default: false] Whether version should be auto published after an upload
    ...
}
  • Parameter 설명

Parameter

 Description

 publish

 aar 파일을 bintray에서 자동으로 배포하게 하려면 publish를 true로 설정해야 합니다. (기본값은 false)

만약, false로 설정할 경우 7일 안에 배포를 해주어야 하며 그렇지 않으면 자동 파기 된다.




4. Add your Bintray package information to the bintray closure

Bintray에 모듈을 업로드 하려면 빈트레이가 관리하는 Gradle 플러그인인 Bintray 플러그인을 사용하면 된다. 


Bintray 패키지 정보를 bintray 클로저에 추가합니다.

bintray {   
    user = 'bintray_user'
    key = 'bintray_api_key'
    pkg {
        repo = 'generic'
        name = 'gradle-project'
        userOrg = 'bintray_user'
        licenses = ['Apache-2.0']
        vcsUrl = 'https://github.com/bintray/gradle-bintray-plugin.git'
    }
}

필수 매개 변수 :

Parameter

 Description

 repo

 bintray에 생성한 Repository

 name

 bintray에 생성한 패키지 명

 licenses

 패키지 라이센스

 vcsUrl

 VCS URL


선택적 매개 변수 :

Parameter

 Description

 userOrg

 repo가 사용자 조직 중 하나에 속한 경우 선택적인 조직 이름입니다.

추가하지 않으면 기본적으로 ‘BINTRAY_USER’을 사용합니다.

 websiteUrl

 웹 사이트 URL

 issueTrackerUrl

 github의 issue tracker를 사용한다면 URL을 설정

 labels

 라벨 설정

 publicDownloadNumbers

 ???

 githubRepo

 Github repository

 githubReleaseNotesFile

 githubReleaseNotesFile 을 설정하면 Release Note를 관리할 수 있다.

README.md를 걸어주거나 별도의 md 파일을 생성하여 Release note를 관리할 수 있다.



5. Add version information to the “pkg” closure

“pkg” 클로저에 버전 정보를 추가합니다.

pkg {
    version {
        name = '1.0-Final'
        desc = 'Gradle Bintray Plugin 1.0 final'
        released  = new Date()
        vcsTag = '1.3.0'
        attributes = ['gradle-plugin': 'com.use.less:com.use.less.gradle:gradle-useless-plugin']
    }
}

필수 매개 변수 :

Parameter

 Description

 name

 Version name

선택적 매개 변수 :

Parameter

 Description

 desc

 Version description (버전에 대한 설명)

 released

 Date of the version release. (릴리즈 된 날짜)

다음 형식 중 하나를 사용할 수 있습니다.

 * Date in the format of ‘yyyy-MM-dd’T’HH:mm:ss.SSSZZ’

* java.util.Date instance

 vscTag

Version control tag name

 attributes

 Attributes to be attached to the version : 버전에 Attach되는 속성


6. Add licenses information

licenses 클로저는 선택 사항입니다.

licenses {
    license {
        name 'The Apache Software License, Version 2.0'
        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
        distribution 'repo'
    }
}

7. Add schema information

scm 클로저는 선택 사항입니다.

scm { // Optional setting
    connection 'https://github.com/shnoble/android-maven-bintray.git'
    developerConnection 'https://github.com/shnoble/android-maven-bintray'
    url 'https://github.com/shnoble/android-maven-bintray'
}

8. Add developers information

developers { // Optional setting
    developer {
        id 'shnoble'
        name 'shnoble'
        email 'shnoble79@gmail.com'
    }
}

9. Upload to bintray

bintrayUpload 실행

./gradlew bintrayUpload

bintrayUpload에 성공하면 아래와 같이 aar 파일이 bintray에 업로드 된 것을 확인할 수 있습니다.



10. Upload test

Bintray에 배포된 aar이 접근이 가능한지 체크하기 위해 dl 주소를 사용합니다.

https://dl.bintray.com/{user-name}}/{repository-name}

다음과 같이 repositories를 설정합니다.

allprojects {
    repositories {
        jcenter()
        maven {
            url  "https://dl.bintray.com/shnoble79/android-maven-jcenter"
        }
    }
}

다음과 같이 dependencies를 설정합니다.

dependencies {
    ...
    compile 'com.shnoble.module:module-bintray:1.0.0@aar'
    ...
}

dl을 이용하여 dependencies를 설정할 때는 @aar을 붙여줘야 합니다.

11. Add the install closure to your build.gradle file

aarbintray 설정으로도 bintray에 업로드가 가능합니다.
하지만 jCenter에 배포를 위해서는 install 클로저를 설정하여 pom.xml 을 설정해야합니다.




다음과 같이 install 클로저를 설정합니다.

install {
    repositories.mavenInstaller {
        pom.project {
            name 'ModuleBintray'
            description 'Bintray sample library'
            url 'https://github.com/shnoble/android-maven-jcenter'
            inceptionYear '2017' // release date

            // Gradle dependencies
            packaging 'aar'
            groupId 'com.shnoble.module'
            artifactId 'module-bintray'
            version '1.0.1'

            licenses {
                license {
                    name 'The Apache Software License, Version 2.0'
                    url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    distribution 'repo'
                }
            }

            scm {   // Optional
                connection 'https://github.com/shnoble/android-maven-jcenter.git'
                developerConnection 'https://github.com/shnoble/android-maven-jcenter'
                url 'https://github.com/shnoble/android-maven-jcenter'
            }

            developers { // Optional
                developer {
                    id 'shnoble'
                    name 'shnoble'
                    email 'shnoble79@gmail.com'
                }
            }
        }
    }
}

project

pom 의 project 정보를 설정 합니다.


Parameter

 Description

 

 name

 모듈 이름

 Optional

 description

 설명

 Optional

 url

 기본 사이트 url

 Optional

 inceptionYear

 release 년도

 Optional

 packaging

 aar

 

 groupId

 groupId

 

 artifactId

 artifactId

 

 version

 version

 


compile '{groupId}:{artifactId}:{version}@{packaging}'

install task 실행

./gradlew install

install task를 실행하면 .m2/repository에 업로드 되며 build/poms/pom-default.xml 파일이 생성된 것을 확인할 수 있습니다.


install task를 실행 후에 bintrayUpload를 실행하면 pom.xml 파일이 업로드 된 것을 확인할 수 있습니다.




12. Add the jar/docs

jCenter 배포를 위해서는 jar/docs 파일을 포함해야합니다.

// JCenter publish
task sourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier = 'sources'
}

// Optional docs
task javadoc(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}

// Optional javadoc
task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

artifacts {
    archives javadocJar // Optional
    archives sourcesJar
}

task findConventions << {
    println project.getConvention()
}

13. Add to jCenter

jCenter는 자동으로 동기화 되지 않습니다.
bintray 사이트에서 Add to jCenter 를 클릭하여 배포합니다.



jCenter 배포는 1일 이상 소요됩니다.

배포과 완료되면 다음과 같이 표시됩니다.



POM Dependency의 버전이 “unspecified”로 표시되는 문제

배포하고자하는 library의 dependency가 아래와 같이 project로 되어있다면 POM.xml에 버전이 “unspecified”로 표시됩니다.

dependencies {
    ...
    compile project(':module-first')
}

아래와 같이 install 클로저에 “unspecified”에 대한 처리를 해줘야 합니다.

install {
    repositories.mavenInstaller {
        ...

        pom.whenConfigured { pom ->
            pom.dependencies.forEach { dep ->
                if (dep.getVersion() == "unspecified") {
                    dep.setGroupId('com.shnoble.module')
                    dep.setVersion('1.0.2')
                }
            }
        }
    }
}

POM Dependency에 type을 ‘aar’로 지정하는 방법

아래와 같이 dependecy에 type이 빠져있다.

  <dependencies>
    <dependency>
      <groupId>com.android.support</groupId>
      <artifactId>appcompat-v7</artifactId>
      <version>25.3.1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.daya.android</groupId>
      <artifactId>daya-http</artifactId>
      <version>0.0.7-alpha</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>

type을 ‘aar’로 지정하고 싶다면 build.gradle의 dependencies에 다음과 같이 ‘@aar’을 추가해준다.

dependencies {
    ...
    compile 'com.daya.android:daya-http:0.0.8-alpha@aar'
}

Using

Repositories 설정

  • Bintray의 jCenter
buildscript {
    repositories {
        jcenter()
    }
}
  • Sonatype의 Maven Central
buildscript {
    repositories {
        mavenCentral()
    }
}

Dependency 추가

dependencies {
    ...
    compile 'com.shnoble.module:module-bintray:1.0.2'
    ...
}

참고 사이트


Comments