GitHubのmavenにAndroidのライブラリをリリースしてみる

# はじめに
株式会社ピー・アール・オーのアドベントカレンダー5日目です。

前回は[iOS用のフレームワークをCocoaPodsに公開する](https://qiita.com/pro_rei/items/00283f4e0fa1716456fc)手順を書きました、今回はAndroid用ライブラリをmavenに公開してみます。

今回はGitHubのpackages機能を利用してライブラリをリリースします。

# 事前準備
- [Android Studio](https://qiita.com/pro_rei/items/00283f4e0fa1716456fc)をインストールする
- GitHub上にAndroidライブラリ用のリポジトリを用意する

# maven-publishプラグインを有効する

今回はAndroid Studioが提供するMaven Publish Pluginを利用してライブラリをリリースします。まずはライブラリモジュールの`build.gradle`にmaven-publishを有効します。

```
plugins {
    id 'maven-publish'
}
```

# リリースするライブラリの情報を定義する

次は、同じライブラリモジュールの`build.gradle`に下記のリリースするライブラリの情報を追加します。
下記のコードはBuild Variantが`release`時のAARライブラリを作ってリリースします。

```
afterEvaluate {
    publishing {
        publications {
            // Creates a Maven publication called "release".
            release(MavenPublication) {
                // Applies the component for the release build variant.
                from components.release

                // You can then customize attributes of the publication as shown below.
                groupId = 'com.lxlgarnett.colorpicker'
                artifactId = 'color-picker'
                version = '1.0.0'
        }
    }
}
```
groupId: ユニークなID、今回はライブラリのパッケージ名を利用する
artifactId: 公開するライブラリ名
version: 公開するライブラリのバージョン

# GitHubのmavenリポジトリを追加する
リリース情報を追加したら、次は公開するmavenリポジトリの定義を追加します。
afterEvaluateのpublishingに下記のコードを追加します。

```
repositories {
    maven {
        name = 'GitHubPackages'

        url = uri("https://maven.pkg.github.com/lxlgarnett/color-picker-android")
    }
}
```

## GitHub用アクセストークンを発行する
[GitHubトークン](https://github.com/settings/tokens)画面にアクセスし、新しいトークンを生成します。
発行したトークンに必ず`write:packages`にチェックを入れてください。
![Screen Shot 2021-12-05 at 17.48.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/925109/ecd8d986-8aab-0bb9-8842-720ed9fb08f0.png)

## GitHub認証情報を追加
次は発行したトークン情報を`build.gradle`に追加します。

```
credentials {
    username = [You GitHub Username]
    password = [Generated GitHub Token]
}
```
※ セキュリティのため、発行したトークン情報はGitHubにコミットしちゃいけないため、ローカルの`.properties`に保存したほうが良いです。
## 完成版のコード
```
afterEvaluate {
    publishing {
        publications {
            // Creates a Maven publication called "release".
            release(MavenPublication) {
                // Applies the component for the release build variant.
                from components.release

                // You can then customize attributes of the publication as shown below.
                groupId = 'com.lxlgarnett.colorpicker'
                artifactId = 'color-picker'
                version = '1.0.0'
            }
        }

        repositories {
            maven {
                name = 'GitHubPackages'

                url = uri("https://maven.pkg.github.com/lxlgarnett/color-picker-android")

                credentials {
                    username = [Your GitHub Username]
                    password = [Generated GitHub Token]
                }
            }
        }
    }
}
```
# ライブラリを公開する
最後はプロジェクトをsyncし、下記のコマンドでライブラリを公開します。

```
./gradlew publish
```

# 公開したライブラリを使ってみる
それでは、実際公開したライブラリはどう使うでしょう？
## mavenリポジトリ情報を追加する
まずは利用するプロジェクト側のプロジェクト用の`build.gradle`にGitHubのmavenリポジトリ情報を追加します。

```
allprojects {
    repositories {
        google()
        mavenCentral()
        maven {
            name = 'ColorPickerGitHubPackages'
            url = uri('https://maven.pkg.github.com/lxlgarnett/color-picker-android')
            credentials {
                username [Your GitHub Username]
                password [Your GitHub Token]
            }
        }
    }
}
```
※ GitHubのmavenリポジトリはPublicなリポジトリでも、認証情報が必要となります。
## Dependency情報を追記する
次はアプリモジュール側の`build.gradle`にライブラリのDependency情報を追加します。追加が終わった後、プロジェクトをsyncし、ビルドすればOKです。

```
implementation 'com.lxlgarnett.colorpicker:color-picker:1.0.0'
```

# 参考サイト
- [Android Studio Maven Publish plugin](https://developer.android.com/studio/build/maven-publish-plugin)