GitHubレポジトリにMavenのリポジトリを作成する

やぎすけAdventCalendar2016 Android Java Maven

Posted on Dec 15


こんにちは、やぎにいです。

やぎすけ Advent Calendar 2016の15日目です。
驚くべきことにもう既に12月の半分となってしまいました。もう今年もおわってしまうんですね……。
このアドベントカレンダーもあと10日ちょっと。頑張っていきましょう。

昨日はうなすけががこのblogのCIをCircle CIからwerckerに変更しましたを書いてくれました。

今日はGitHubでMavenのリポジトリをpushするお話です。


はじめに

僕はこのカレンダーの13日目の記事で、主に自分が使う用途としてRxBoxというjavaライブラリを作りました。
これをいざ自分で使うというときに、いちいち.jarファイルをビルドで作成してそれを物理的にインポートするとなるとすごく面倒です。

そこでAndroid StudioとかでAndroidのアプリを作っているときにbuild.gradlecom.hoge.lib:x.y.zと書けば使えるようになるのを思い出し、僕のこのライブラリもそれで使えるようにしてやろう!と意気込みました。

インターネットでさて、これはどうやるのかと調べてみるとどうやらbintrayというところに登録し、そこにpushしてあげたあと、jcenterに反映させるとすごく楽(しかもGradleのプラグインでよしなにできる)らしいということがわかりました。
ならばやるしかありません。

ところが、いくらアカウントを作っても、他の記事で紹介されているようなMavenのリポジトリを作成するボタンが見つかりません。稚拙な英語でサポートに連絡してみると「すまんな、個人とか個人アカウントでは作れないので所属団体でリポジトリを作ってくれ」という返答。
な、なんだってー。

数歩妥協して、maven { url 'http://hoge.com/lib' }を追加することにはなるが、GitHubで確かホストしているライブラリを過去に見たことがあるな……という記憶から色々調べてみました。

Mavenリポジトリの作成

ほぼ全て【Android】Libraryを作ってprivateなgithubリポジトリにpushして、チームのみんなでgradleに書くだけで使えるようにするまで - Qiitaこちらを参考にさせていただきました。本当にありがとうございます。
ライブラリプロジェクトのbuild.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def repo = new File(rootDir, "repository")

apply plugin: 'maven'

uploadArchives {
    repositories {
        mavenDeployer {
            repository url: "file://${repo.absolutePath}"
            pom.version = 'x.y.z'
            pom.groupId = 'com.yagi2'
            pom.artifactId = 'rxbox'
        }
    }
}

と記入し、./gradlew assembleRelease uploadArchivesこれでルートにrepositoryというディレクトリが出来て、その中にpomファイルとか色々作成されてると思います。

これでローカルにMavenのリポジトリが完成しました。

GitHubでホストする

次はこの完成したリポジトリをGitHubにPushしてあげましょう。
そのままPushしてもいいのですが、使う側がgradle.buildに記入するリポジトリURLがイマイチかっこよくありません。
そこで、GitHubのGitHub Pagesの機能を使い、http://<user>.io/lib のようなURLで依存関係を解決できるようにしましょう。

GitHubPagesはリポジトリにgh-pagesというブランチを作り、そこにPushすればそれらがホストされます、例えばgh-pagesindex.htmlが存在すればhttp://<user>.io/<repo>というURLを叩けばそのindex.htmlが描画されます。

今回はローカルにrepositoryというディレクトリが完成したので、このディレクトリをgh-pagesにPushするのが最終目的です。
しかし、このリポジトリはライブラリ本体や、Android用のサンプルコードなど、様々なファイルから構成されています。それらがgh-pagesにPushされるのはあまりよくありません。repositoryディレクトリだけがPushされたい。

そこで今回は頑張ってググって出てきたnobuoka/commit-built-files-to-gh-pages-branch.markdownこちらを参考にし、Pushすることができました。(本当に有難うございます)

1
2
3
4
5
6
7
8
9
$ git add -f ./repository
$treeObjId = git write-tree --prefix=repository
$ git reset -- ./repository

$ git branch gh-pages

$commitId = git commit-tree -p gh-pages -m "add the vx.y.z files for the Maven repository" $treeObjId

git update-ref refs/heads/gh-pages $commitId

この手順で無事repositoryディレクトリだけgh-pagesにPushすることが出来ました。
もともとgh-pagesというブランチをローカルに作成してなかったため、途中で作成しています。
ツリーオブジェクトをつくり、それでコミットを作り、リモートのgh-pagesにそのコミットを参照させる、という流れらしいです。

今回はgh-pagesにだけrepositoryディレクトリをPushし、このディレクトリは他のブランチに含みたくなかったため、この手法をとりましたが、そうでない場合(ビルドした物をdevelopmasterブランチに含めてもいい場合)はgit subtreeコマンドを利用して特定のディレクトリだけ別ブランチに切り出して公開するのが手っ取り早いようです。

これで今回作成したライブラリは使いたいプロジェクトのbuild.gradle

1
2
3
4
5
6
7
repositories {
    maven { url 'http://yagi2.github.io/RxBox/' }
}

dependencies {
    compile 'com.yagi2:rxbox:0.0.1'
}

と記入するだけで使えるようになりました。
嬉しい!早く充実させなければ。


おわりに

今回はbintrayに見事にお断りされたので(個人でMavenリポジトリ作れないと書いているブログは見当たらなかった)この手法を取りました。
利用する側はちょっとurlを書かなければならないという手間は出来てしまいますが、ビルドして出来たライブラリをインポートしてという手順を踏むよりは100倍良いのではないかと思います。 個人利用の簡単なライブラリではありますが、頑張って充実させていきたいと思います(僕も今のところ足りなくて不便している)

以上。やぎにいでした!



comments powered by Disqus

<< Mac上でMiddlemanを使ってCentOSにホストするとNFD問題にぶち当たる     dropbox-java-sdkをRxJavaで使うライブラリを作ってみました >>



2016 やぎ小屋