Các bước để push một thư viện Android lên Maven Central
Gradle
4
Maven_Central
1
android
40
White

Le Van Hoang viết ngày 05/06/2015

Giới thiệu

Trong bài này mình sẽ hướng dẫn upload thư viện Android của bạn lên Maven Central để chia sẻ cho team hoặc cộng đồng sử dụng. Mình đã có kinh nghiệm publish một số thư viện Android lên Maven Central (FButton, SegmentedControl), trong quá trình làm thì nhận thấy các hướng dẫn hiện có chưa thực sự đầy đủ và dễ hiểu nên quyết định viết bài này. Hi vọng giúp đỡ được bạn nào quan tâm.

Tổng quan

Về cơ bản thì bạn cần phải thực hiện 6 bước.

  1. Đăng ký tài khoản ở Sonatype
  2. Request tạo repository
  3. Config gradle.properties và build.gradle
  4. Tạo chữ ký GPG
  5. Push lên Sonatype
  6. Release sang Maven Central

Các bước thực hiện

1. Đăng ký tài khoản ở Sonatype

Đầu tiên vào Sonatype để đăng ký một tài khoản.

2. Request tạo repository

Sau khi có được account thì vào Projects -> Community Support (Open Source Project) để tạo ticket request việc mở repository cho mình. (Một repository thì có thể upload nhiều thư viện, miễn sao cùng groupid là được. Vì vậy bước này chỉ làm 1 lần duy nhất)

Bạn có thể tham khảo ticket của mình đã tạo ở đây.

GroupId: GroupId ở maven. GroupId này rất quan trọng nên bạn hãy chọn domain không trùng với project khác. Ví dụ như com.github.hoang8f chẳng hạn.
Project URL: Link tới source code
SCM url: Mình để clone URL của git
UserName: Tên đăng ký ở Sonatype

Sau khi submit ticket thì khoảng 1-2 ngày (có thể sớm hơn) sẽ có approve ở sonatype.
À có một chú ý là sau khi promote thư viện lên Maven Central thành công thì hãy comment lại ở ticket

3. Config gradle.properties và build.gradle

Khi push thư viện lên thì cần chỉ định rất nhiều tham số, ví dụ như Build type, version name, version code... rất may là anh Chris Banes đã viết cho một script để đơn giản quá trình này. Tất cả config đều được thực hiện ở file gradle.properties.

Bạn chỉ việc để script maven_push.gradle vào trong thư mục chứa gradle.properties ở top-level.

3.1. Config cho gradle.properties (file ở top-level)

#VERSION_NAME=1.0.5-SNAPSHOT
VERSION_NAME=1.0.5
VERSION_CODE=5
GROUP=info.hoang8f

POM_DESCRIPTION=An Android segmented control implementation inspired by Segmented Controls for iOS.
POM_URL=https://github.com/hoang8f/android-segmented-control
POM_SCM_URL=https://github.com/hoang8f/android-segmented-control.git
POM_SCM_CONNECTION=scm:git@github.com:hoang8f/android-segmented-control.git
POM_SCM_DEV_CONNECTION=scm:git@github.com:hoang8f/android-segmented-control.git
POM_LICENCE_NAME=MIT License
POM_LICENCE_URL=http://opensource.org/licenses/MIT
POM_LICENCE_DIST=repo
POM_DEVELOPER_ID=hoang8f
POM_DEVELOPER_NAME=Le Van Hoang
nexusUsername=
nexusPassword=

3.2. Config cho gradle.properties (file ở thư mục Users ~)

Nếu bạn để ý thì nexusUsername và nexusPassword mình đang để trống, là bởi vì những thông tin này lúc bạn push lên repo ở github chẳng hạn thì sẽ bị public ra ngoài.
Vì thế cần có thêm 1 file config nữa để ở local của máy tính mà chỉ có bạn mới nhìn thấy mà thôi.

File gradle.properties được để trong thư mục .gradle ở User hiện tại.

  • đối với máy Mac: ~/.gradle/gradle.properties
  • đối với máy Windows: C:\Users.gradle\gradle.properties

Các bạn thêm 2 dòng sau vào file gradle.properties đó (file này chưa có thì tạo mới nhé):

nexusUsername=user_name_đã_đăng_ký
nexusPassword=password_tương_ứng

3.3. Config cho gradle.properties (file ở thư mục library)

POM_NAME=Android Segmented Library
POM_ARTIFACT_ID=android-segmented
POM_PACKAGING=aar

3.4. Config cho file build.gradle (file ở top-level)

Chú ý là classpass ở dependencies có thể thay đổi tuỳ theo version của AndroidStudio.

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

buildscript {
    repositories {
        mavenCentral()
        maven {
            url "https://oss.sonatype.org/content/repositories/snapshots"
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.1'
    }
}

def isReleaseBuild() {
    return version.contains("SNAPSHOT") == false
}

allprojects {
    version = VERSION_NAME
    group = GROUP

    repositories {
        mavenCentral()
        mavenLocal()
        maven {
            url "https://oss.sonatype.org/content/repositories/snapshots"
        }
    }
}

apply plugin: 'android-reporting'

Nhìn vào hàm isReleaseBuild thì có thể thấy là nếu ở gradle.properties VERSION_NAME có chuỗi SNAPSHOT thì thư viện sẽ được tải lên snapshot repository. Mục đích chính là để test trước khi release.

  • Mình có đọc được đâu đấy thì cần ít nhất 1 lần release SNAPSHOT thì mới release được chính thức.

3.5. Config cho file build.gradle (file ở thư mục library)

Thêm vào dòng cuối cùng như sau:

apply from: '../maven_push.gradle' 

4. Tạo chữ ký PGP

Chúng ta cần phải cung cấp một chữ ký PGP thì mới có thể upload được thư viện lên.
Nếu bạn chưa có thì có thể tạo mới, chi tiết có thể xem ở đây.
Mình tóm tắt lại các lệnh cần thiết.

4.1. Tạo key

Chạy lệnh gpg --gen-key để tạo ra key, ngoài tên, email, password là chỉ định, còn lại mình để mặc định hết.

4.2. Confirm lại

Sau khi tạo được key rồi chạy lệnh gpg --list-keys để xem key của mình đã được tạo hay chưa.
output sẽ như bên dưới, bạn chỉ cần quan tâm tới id của public key ở dòng đầu tiên.

    pub   2048R/4106E32D 2015-04-14
    uid                  Le Van Hoang
    sub   2048R/6B70CF29 2015-04-14

4.3. Sync key

gpg --keyserver hkp://pgp.mit.edu --send-keys 4106E32D

bước cuối cùng là chỉ định secret key file, và id password của public key.
Bởi vì chứa password không muốn cho người khác biết nên tương tự như nexusPassword như ở bên trên thì những giá trị này định nghĩa ở file gradle.properties ở thư mục người dùng.

  • đối với máy Mac: ~/.gradle/gradle.properties
  • đối với máy Windows: C:\Users.gradle\gradle.properties
    signing.keyId=xxxxxxx
    signing.password=YourPublicKeyPassword
    signing.secretKeyRingFile=~/.gnupg/secring.gpg 

5. Push lên Sonatype:

./gradlew uploadArchives 

có thể thêm --stacktrace để debug nếu có lỗi xãy ra

6. Release sang Maven Central

sau khi upload thành công lên sonatype thì các bạn đã đi được 2/3 chặng đường khó khăn nhất rồi :D
Bước còn lại là login vào Sonatype và promote thư viện vừa upload.

https://oss.sonatype.org/#welcome

Vào Staging Repositories để search thư viện vừa upload lên, ví dụ như của mình bên dưới.

tiếp theo bấm vào close , chờ 1 chút refresh sau đấy bấm vào release.

sau khi confirm xong thì sẽ có mail thông báo Nexus: Promotion Completed gửi về địa chỉ mail của bạn.

7. Sử dụng với Android Studio

Chờ một thời gian rồi lên Maven Central kiểm tra sẽ thấy thư viện của bạn được publish.
Đối với trường hợp release lên Maven Central rồi thì chỉ cần thêm dòng compile như bên dưới là có thể sử dụng được

compile 'info.hoang8f:android-segmented:1.0.5'

Nếu là release snapshot thì ở repositories thêm đường dẫn tới Sonatype snapshot

maven {
    url "https://oss.sonatype.org/content/repositories/snapshots"
}

Kết luận

Việc upload thư viện lên Maven Central không quá khó, tuy nhiên lần đầu tiên có khá nhiều bước cần phải thực hiện khá là mất thời gian. Từ lần thứ hai trở đi thì mọi việc nhẹ nhàng hơn nhiều, chỉ cần sửa file gradle.properties và chạy lệnh uploadArchives là có thể lên version được.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Le Van Hoang

3 bài viết.
21 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
34 17
Bối cảnh Một trong những vấn đề công ty mình gặp phải đó là việc theo dõi thời gian đi làm và ra về của các nhân viên trong công ty. Bởi vì văn p...
Le Van Hoang viết hơn 2 năm trước
34 17
White
1 0
Espresso test framework Espresso là framework để test dành cho android, nó giúp cho lập trình viên dễ dàng viết kiểm thử tự động liên quan tới gia...
Le Van Hoang viết 1 năm trước
1 0
Bài viết liên quan
White
6 0
Gradle là gì? Sao lại xử dụng Gradle trong Android? Sử dụng Gradle như thế nào? Đó là một trong rất nhiều câu hỏi mà các Android developer mới làm ...
khoatd92 viết 8 tháng trước
6 0
White
10 2
Xin chào các bạn. Chắc hẳn mỗi chúng ta đều đã từng phát triển app sử dụng API của bên thứ 3, và chắc mọi người đều biết là hầu hết các API service...
Hải Nguyễn viết 1 năm trước
10 2
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
3 bài viết.
21 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!