Local Repositoryの構築と参照方法について、まとめます。
この記事は「Local Repositoryの構築と参照(2022.04発行)」をAndroid Studio Giraffe(2023.07)向けに書き直したものです。
Gradle Ver7.x以降、リポジトリの構築方法が若干変更になりました。
また、GiraffeよりGradleでKotlin DSLが推奨になりました。それに従い、ビルドスクリプトをKotlinで記述したコードに置き換えています。
※環境:Android Studio Giraffe | 2022.3.1
:Android Gradle Plugin 8.1.0
:Gradle 8.0
目次
Local Repositoryとは
Local Repositoryはユーザのホームフォルダに作成されるリポジトリです。
Linuxの場合
:~/.m2/repository
よって、ライブラリの提供範囲はユーザになります。
ライブラリはMavenリポジトリ形式です。
ライブラリの構築
始めに、Module Libraryを作成(「Module Libraryの構築と参照(Giraffe編)」を参照)します。
その後、以下のことを行います。
ビルドスクリプトの修正
ビルドスクリプト(build.gradle.kts)へ以下の内容を追記します。
※拡張子「.kts」はKotlinで記述されたビルドスクリプトを示す
- プラグイン読み込み
- Software Componentの設定
- 発行の指示書
plugins { id("com.android.library") id("org.jetbrains.kotlin.android") id("maven-publish") // プラグリンの読み込み } android { ... publishing { singleVariant("release") // Software Componentの設定 } } publishing { publications { // 発行の指示書 create<MavenPublication>("myLib") { // タスクの作成 groupId = "com.example.lib" artifactId = "decoration" version = "0.0.1" afterEvaluate { // ビルドスクリプトの評価後に実行 from(components["release"]) // Componentの取得方法 } } } // ←ここにrepositories(発行先のリポジトリを指定)がないので // ←Local Repository(デフォルト)が発行先になる } dependencies { implementation("androidx.core:core-ktx:1.9.0") implementation("androidx.appcompat:appcompat:1.6.1") implementation("com.google.android.material:material:1.9.0") testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") }
プラグイン(maven-publish)を読み込みます。これにより、ライブラリ発行のためのDSL(Domain Specific Language)が利用可能になります。
Software Componentの設定Gradle 7.x以降、Componentの設定を明記するようになりました。
ここでいうComponentとは、「ライブラリに含まれるデータの目録」のことです。
サンプルはsingleVariantを用いた例です。
singleVariantは公開する単一のバリアントをComponentへ指定します。これにより、そのバリアントのAAR(Android ARchive)ファイルがライブラリに含まれます。そして、バリアント名がComponentを取得する際の参照Keyになります。
発行の指示書「Componentをどのように発行するか?!」を指定する指示書です。
指示書に従ってタスクが作成されます。そして、タスクの実行により、ライブラリは発行されます。
プロパティ | 概要 |
---|---|
groupId | 管理者を一意に識別する名前です。 「どこの誰が開発したライブラリであるか」を明確にするために、ドメイン(パッケージ)名を指定します。 【例】groupId = 'com.example.lib' |
artifactId | ライブラリ名です。 ライブラリを参照する時、この名前が使用されます。 【例】artifactId = 'decoration' |
version | バージョンです。 バージョンの運用方法は自由です。一貫性を持たせるためにSemantic Versioningに従うという選択肢もあります。 【例】version = '0.0.1' |
タスクの作成
build.gradle.ktsを再読み込みするために「Sync Project」を実行すると、タスクが作成されます。
タスクの実行
タスクを実行すると、ビルドバリアントで指定されたビルドが行われた後に、ライブラリの発行が指示書に従って行われます。
以下はサンプルで作成されたLocal Repositoryのフォルダ構成です。Mavenリポジトリ形式になっています。
C:¥Users¥ユーザ名¥.m2¥repository └── com // groupId └── example // groupId └── lib // groupId └── decoration // artifactId ├── 0.0.1 // version │ ├── decoration-0.0.1.aar │ ├── decoration-0.0.1.module │ └── decoration-0.0.1.pom └── maven-metadata-local.xml
ライブラリの参照
Local Repositoryをライブラリの参照先に追加します。mavenLocal()関数が参照先を示す関数です。
pluginManagement { repositories { google() mavenCentral() gradlePluginPortal() } } dependencyResolutionManagement { // すべてのモジュールに有効な指示 repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { // ライブラリの参照先となるリポジトリのリスト google() mavenCentral() mavenLocal() // Local Repositoryを追加 } } rootProject.name = "My Application" include(":app")
「≧ Gradle Version 7.0」からrepositories命令の記述場所が、repositoriesModeの値により制限されるようになりました。注意が必要です。
RepositoriesMode | 概要 |
---|---|
FAIL_ON_PROJECT_REPOS | settings.gradleでrepositoriesを宣言 モジュール名/build.gradleでrepositoriesを宣言たし場合、ビルドエラー |
PREFER_PROJECT | settings.gradleで宣言したrepositoriesは無視 モジュール名/build.gradleでrepositories命令を宣言 |
PREFER_SETTINGS | settings.gradleでrepositoriesを宣言 モジュール名/build.gradleで宣言したrepositoriesは無視 |
参照するライブラリを依存関係リスト(dependencies)に追加します。フォーマットは「groupId:artifactId:version」です。
plugins { id("com.android.application") id("org.jetbrains.kotlin.android") } android { ... } dependencies { ... implementation("com.example.lib:decoration:0.0.1") ... }
これで、Local Repositoryのライブラリを参照するようになります。
サンプルの実行結果
サンプルの実行結果を示します。
import com.example.lib.decoration.Brackets import com.example.lib.decoration.angle import com.example.lib.decoration.round import com.example.lib.decoration.square ... { val _str1 = Brackets("#", "#").bracket("Hello World !!") println(_str1) val _str2 = round("Hello World !!") println(_str2) val _str3 = angle("Hello World !!") println(_str3) val _str4 = square("Hello World !!") println(_str4) }
09:51:12.439 4587-4587 System.out I # Hello World !! # 09:51:12.439 4587-4587 System.out I ( Hello World !! ) 09:51:12.439 4587-4587 System.out I < Hello World !! > 09:51:12.440 4587-4587 System.out I [ Hello World !! ]
タスクのネーミングルール
タスクは発行するライブラリ毎に作成されます。
publishToMavenLocalタスクは一括で処理するタスクです。
この例では、sample-releaseとsample-debugライブラリが発行されます。
C:¥Users¥ユーザ名¥.m2¥repository └── com └── example └── lib ├── sample-debug │ ├── 0.0.1 │ │ ├── sample-debug-0.0.1.aar │ │ ├── sample-debug-0.0.1.module │ │ └── sample-debug-0.0.1.pom │ └── maven-metadata-local.xml └── sample-release ├── 0.0.2 │ ├── sample-release-0.0.2.aar │ ├── sample-release-0.0.2.module │ └── sample-release-0.0.2.pom └── maven-metadata-local.xml
注意1:Componentの作成タイミング
Componentは、singleVariantの評価(実行)時ではなく、全て(GradleのRootおよびSubプロジェクト)のビルドスクリプトを評価した後に作成されます。よって、Componentを参照する際は、全てのビルドスクリプトの評価を待つ必要があります。
... afterEvaluate { // ビルドスクリプトの評価後に実行 from(components["release"]) // Componentの取得 } ...
注意2:タスクが作成されないとき
「Sync Project」の実行でGradleタスクが作成されないときは、以下の項目のチェックを確認してください。
関連記事: