💨
Androidプロジェクトで別private Repositoryのaarを読み込む
前提
- GitHub Packagesなどサーバーを立てずに実現する。
- ライブラリとしてのrepositoryを置いて都度aar化するわけではなく、外部提供のaarを管理するためのprivate repositoryを運用するイメージ。
- aarは開発用と本番用の2つを管理し、アプリ側からflavor, build typeに応じて読み込む。
- AndroidプロジェクトではKotlin DSLを利用。
1. aarを置くrepositoryの準備
手順
- private repositoryを作成。
-
https://github.com/tarobu/sample-repo
とする。
-
- 利用したいaarの準備
-
SampleLib-stub.aar
,SampleLib.aar
とする。
-
- pomファイルの準備 ※準備していない場合は後述する内容で作成
-
SampleLib.pom
とする。
-
- aarをダウンロードする操作が関わるユーザー全員にアクセス権限を付与(Team単位だったり)。
- default branch以外にアクセスさせたいならbranchを作成
- 今回は
feature
branchを対象とする
- 今回は
- Maven構成にしてaar, pomを配置する。
- root/任意のpath/groupId/artifactId/version/xxx.aar(xxx-stub.aar, xxx.pomも)
- 任意のpath: 1つ以上のディレクトリ(階層OK), 今回は
maven
とする。 - groupId: pomに記載の値で
com.tarobu.sample
の場合はcom/tarobu/sample
のpathになる。 - artifactId: pomに記載の値で
tarotaro
の場合はそのままtarotaro
のpathになる。 - version: pomに記載の値で
1.0.0
の場合はそのまま1.0.0
- 任意のpath: 1つ以上のディレクトリ(階層OK), 今回は
- ↑の今回の値だと以下の構成になる。
- root/maven/com/tarobu/sample/tarotaro/1.0.0/SampleLib.aar
- root/maven/com/tarobu/sample/tarotaro/1.0.0/SampleLib-stub.aar
- root/maven/com/tarobu/sample/tarotaro/1.0.0/SampleLib.pom
- ↑URL的にはbranch名も含まれるので以下のような値になるはず。
https://github.com/tarobu/sample-repo/blob/feature/maven/com/tarobu/sample/tarotaro/1.0.0/SampleLib.aar
https://github.com/tarobu/sample-repo/blob/feature/maven/com/tarobu/sample/tarotaro/1.0.0/SampleLib-stub.aar
https://github.com/tarobu/sample-repo/blob/feature/maven/com/tarobu/sample/tarotaro/1.0.0/SampleLib.pom
- 一応補足: aarやpomの構成は上記のようにMaven構成にする必要があるがREADMEや他の要素は自由で置いてOK。
- root/任意のpath/groupId/artifactId/version/xxx.aar(xxx-stub.aar, xxx.pomも)
pomの中身の確認
- 以下などを参考にしベースを作成する。
- 例で設定した今回の値だと以下のような値になる。
// .. <groupId>com.tarobu.sample</groupId> <artifactId>tarotaro</artifactId> <version>1.0.0</version> <packaging>aar</packaging> // ..
2. aarを置いてるrepositoryにアクセスするためのPersonal Access Tokenの準備
- 通常通りのPATを用意すればOK。
- 注意点はPATのSSO承認が必要な場合は忘れずに。
3. Androidプロジェクト側の設定
- local.propertiesに先ほど作成したPATを記述する。keyは次のステップで指定する値と同じになるように。今回は
pat=
とすると以下。
pat=gph_xxxxxxx
- 構成次第だがrootのbuild.gradle.ktsで以下のようにする。
// ..
repositories {
google()
mavenCentral()
// ※↑はあくまで基本的に同じ箇所に記述するでいいことを明示するためであってaarを読み込むために必要というわけではない
maven {
url = uri("https://raw.githubusercontent.com/tarobu/sample-repo/feature/maven")
credentials(HttpHeaderCredentials::class.java) {
val pat = localproperties.getProperty("pat")
// TODO 必要だったらnullチェックなど
this.name = "Authorization"
this.value = "token $pat"
}
// TODO これ要らないかも
authentication {
create("header", HttpHeaderCredentials::class.java)
}
}
}
// ..
- 以下、解説
- uri:
https://raw.githubusercontent.com/
+ organization + repository名 + branch名 + aarを置いたrepository側で設定した任意のpath(今回はmaven
としたけど一致さえすれば何でもOK, 何もなしはダメ)-
https://raw.githubusercontent.com/
というのはrepositoryの要素のURL(例えばpomファイル)をブラウザで開いた時にGitHub右上にraw
タブがあるのでそれを押すと同じようなURLになることが確認できるはず。
-
- 今回は前のステップでPATをlocal.propertiesに記述する前提だからだが、もちろん他の方法でもOK。参考にCIでのbuildの場合はjobでlocal.propertiesに
pat=...
で書き込めればOK。
- uri:
4. 環境ごとにライブラリをimplementationする
今回はstub用と通常のaarをflavorで分けて読み込む前提なので以下のようにする
dependencies {
// devImplementationなどは環境に応じて使えるか次第で今回は関係ないので説明省略
devImplementation("com.tarobu.sample:tarotaro:1.0.0:stub@aar")
prodImplementation("com.tarobu.sample:tarotaro:1.0.0@aar")
}
- 指定はpom記載の
$groupId:$artifactId:$version$classifier@aar
- classifierはaarの前に付けている区別する値がある場合で、今回だと
SampleLib-stub.aar
のstub
部分。
- classifierはaarの前に付けている区別する値がある場合で、今回だと
5. Sync Project with Gradle Filesで読み込む
- Sync..結果で「Failed..」みたいになっている場合はPATの問題があるためターミナルで以下を実行して200返ってくるか確認すると良い。
curl -L -v -H "Authorization: token PAT" "https://raw.githubusercontent.com/tarobu/sample-repo/feature/maven/com/tarobu/sample/tarotaro/1.0.0/SampleLib.pom"
- 色々aarを置いてるrepository側の構成を変えてSyncし直してエラーは出ないが明らかにaarのコード(importなど)にアクセスできていない場合はgradleのキャッシュ問題で読み込めていない可能性があるのでキャッシュを破棄してみると良い。
-
User/.gradle/caches
を全削除して再実施。
-
Discussion