カジュアルにライブラリを作っていく話 Android のサンプルと共に

アプリケーション開発中にライブラリが生まれることがあります。

 1. そのアプリの中で何度も登場したモジュール、処理
 1. 既存のAPIが使いにくい、やりたいことができないので拡張した部分
 
あなたの悩みはみんなの悩みの可能性があります。カジュアルにライブラリ化していくことで、OSSの界隈に貢献をしていきましょう。

## ライブラリ公開の注意

業務内容など、公にはできない部分が含まれることが無いかどうかは気をつけるべきでしょう。また、業務に密接に関連するライブラリはより一般的である物の方がライブラリとして利用しやすい物になるとも言えますが、開発のコストも増します。

カジュアルに公開をすると言っても、不便だと意味がありません。ちょうどいい所を考えるようにしましょう。

## ライブラリを公開する場所

Androidのライブラリはビルドをした`jar`や`aar`と言ったバイナリを Gradle で解決可能なWebサーバーに置いておくのがデファクトではないでしょうか。公開されていて無料で利用可能な置き場はいくつかありますが、今回は以下の理由で [bintray](https://bintray.com/) を利用します。

 1. 特にアカウントを作る必要がない
   - Githubのアカウントでログインができます
 2. バイナリの署名とかがいらない
   - その良し悪しは置いておいて、不要なのでカジュアルにバイナリをアップロードできます
 3. Gradleプラグインもあるので、コマンド一発＆CI環境からのデプロイも簡単
 4. jcenter にリンクもしてくれるので、デフォルトのGradleで管理されたAndroidアプリのプロジェクトからも参照ができる
 
## ライブラリを作る

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/6756/2649490a-198c-6aa4-1be3-8f4b8e08a4cf.png)


Android Studio でモジュールを作ります。ここでつけた名前がバイナリの名前になっていくので、ライブラリの名前をそのままつけるのが正しいっぽいですね。

モジュールを作ったらコードを書いていきましょう。また、ライブラリだけでなくサンプルコードやテストコードをつけることでライブラリの利用者にコードが利用方法を知る手がかりになって良いと思います。

## bintray にアップロードをする
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/6756/70a32f6a-1d58-ae62-8155-1cdca5c7eb00.png)

bintray のページから新しいリポジトリを作ります。Description など書いていきましょう。Repositry Type は Maven を選びます。

## gradle に bintray のプラグインを設定する

[bintray/gradle-bintray-plugin](https://github.com/bintray/gradle-bintray-plugin)を利用します。設定の内容は適宜読み替えてください。

```Groovy
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0-alpha1'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
    }
}

def siteUrl = 'https://github.com/numa08/DynamicFragmentPagerAdapter'
def gitUrl = 'https://github.com/numa08/DynamicFragmentPagerAdapter.git'

bintray {
    user = bintray_username
    key = bintray_api_key
    configurations = ['archives']
    pkg {
        repo = 'maven'
        name = library_id
        userOrg = 'numa08'
        licenses = ['MIT']
        vcsUrl = gitUrl
        websiteUrl = siteUrl
        issueTrackerUrl = siteUrl + '/issues'
        labels = ['android']
        publicDownloadNumbers = true
    }
}

install {
    repositories.mavenInstaller {
        pom {
            project {
                packaging 'aar'
                name 'Remove and add and swap fragment pager adapter'
                url siteUrl
                developers {
                    developer {
                        id 'numa08'
                        name 'numa08'
                        email 'n511287@gmail.com'
                    }
                }
                scm {
                    connection gitUrl
                    developerConnection gitUrl
                    url siteUrl

                }
            }
        }
    }
}

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

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

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}
artifacts {
    archives javadocJar
    archives sourcesJar
}

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

また、プロジェクトのメタな設定を`gradle.properties`に書きます。

```
version=0.6.2
group=net.numa08
library_id=dynamicfragmentpageradapter
```

最後にbintrayの認証情報を書きます。これはリポジトリには含められない情報なので置き場を考えましょう。私はよく`~/.gradle/gradle.properties`に書いています。

```
bintray_username=numa08
bintray_api_key=your api key
```

最後に `gradle bintrayUpload` でバイナリをアップロードすることができます。

##  CI環境

travis CIや circle ciを利用してバイナリのデプロイを自動化できます。最近の自分の戦略は以下の感じ

 - developブランチのバイナリはどんどん bintray にアップロードをする
   - このとき、バージョン番号の後ろに自動的にビルド番号が入るようにしておくと良いと思う
   - あと、 `unstable` とかつけておこう
 - tag を打ったら`stable`なバージョンのアップデートということで、bintrayにアップロードをする
 
## jcenter

bintray から link to jcenter を選ぶことで、jcenterにアップロードをすることができます。だいたい2日くらいでリンクをしてくれるっぽいです。

## 利用をする

jcenter にアップロードされていれば、`build.gradle`のdependenciesに

```groovy
compile '[organization_id]:[library_id]:[version]'
```

で依存性を解決できるようになります。

## その他

その他に準備をするもの

 - License.txt
   - OSSで公開するのなら、ライセンスを定めておくのが良いでしょう。ApacheやMITなど使いやすいやつが好まれる雰囲気です。
 - Readme.md
   - Readmeにはライブラリの目的や使い方を書いておきましょう。またUIライブラリの場合、gifアニメなんかで動いてる風景を掲載しておくと、雰囲気がより伝わりやすくなると思います。
 - サンプル・テストコード
   - サンプルやテストコードはそのままライブラリを利用するときのコードのサンプルです。Readmeの英語が苦手でもコードを書いておけばそれなりに通じると思います。
   
## まとめ

ライブラリの公開方法について書きました。カジュアルにライブラリを公開してOSS界隈に貢献していきましょう。