アプリケーション開発中にライブラリが生まれることがあります。
- そのアプリの中で何度も登場したモジュール、処理
- 既存のAPIが使いにくい、やりたいことができないので拡張した部分
あなたの悩みはみんなの悩みの可能性があります。カジュアルにライブラリ化していくことで、OSSの界隈に貢献をしていきましょう。
ライブラリ公開の注意
業務内容など、公にはできない部分が含まれることが無いかどうかは気をつけるべきでしょう。また、業務に密接に関連するライブラリはより一般的である物の方がライブラリとして利用しやすい物になるとも言えますが、開発のコストも増します。
カジュアルに公開をすると言っても、不便だと意味がありません。ちょうどいい所を考えるようにしましょう。
ライブラリを公開する場所
Androidのライブラリはビルドをしたjar
やaar
と言ったバイナリを Gradle で解決可能なWebサーバーに置いておくのがデファクトではないでしょうか。公開されていて無料で利用可能な置き場はいくつかありますが、今回は以下の理由で bintray を利用します。
- 特にアカウントを作る必要がない
- Githubのアカウントでログインができます
- バイナリの署名とかがいらない
- その良し悪しは置いておいて、不要なのでカジュアルにバイナリをアップロードできます
- Gradleプラグインもあるので、コマンド一発&CI環境からのデプロイも簡単
- jcenter にリンクもしてくれるので、デフォルトのGradleで管理されたAndroidアプリのプロジェクトからも参照ができる
ライブラリを作る
Android Studio でモジュールを作ります。ここでつけた名前がバイナリの名前になっていくので、ライブラリの名前をそのままつけるのが正しいっぽいですね。
モジュールを作ったらコードを書いていきましょう。また、ライブラリだけでなくサンプルコードやテストコードをつけることでライブラリの利用者にコードが利用方法を知る手がかりになって良いと思います。
bintray にアップロードをする
bintray のページから新しいリポジトリを作ります。Description など書いていきましょう。Repositry Type は Maven を選びます。
gradle に bintray のプラグインを設定する
bintray/gradle-bintray-pluginを利用します。設定の内容は適宜読み替えてください。
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に
compile '[organization_id]:[library_id]:[version]'
で依存性を解決できるようになります。
その他
その他に準備をするもの
- License.txt
- OSSで公開するのなら、ライセンスを定めておくのが良いでしょう。ApacheやMITなど使いやすいやつが好まれる雰囲気です。
- Readme.md
- Readmeにはライブラリの目的や使い方を書いておきましょう。またUIライブラリの場合、gifアニメなんかで動いてる風景を掲載しておくと、雰囲気がより伝わりやすくなると思います。
- サンプル・テストコード
- サンプルやテストコードはそのままライブラリを利用するときのコードのサンプルです。Readmeの英語が苦手でもコードを書いておけばそれなりに通じると思います。
まとめ
ライブラリの公開方法について書きました。カジュアルにライブラリを公開してOSS界隈に貢献していきましょう。