##モジュール毎のbuild.gradleのdependenciesの記述を共通化したい
Android Studioでレイヤー毎にモジュール化を行ったプロジェクトを作成した際に、モジュール間の依存性解決にKoinを用いたところ、各モジュールのdependenciesにそれぞれKoinに対するimplementationを記載しなければいけなくなった。
dependencies {
// Koin
implementation "org.koin:koin-core:$rootProject.koin_version"
implementation "org.koin:koin-android:$rootProject.koin_version"
}
すべてのモジュールにこれを記載していくのはあまりイケていないなー。共通化したいなと思い、なにか良い方法が無いかなと調べたところ、プロジェクトレベルのbuild.gradleにsubprojects
ブロックを定義するとすべてのモジュールで共通となる記述をまとめることが出来るようなので、試してみました。
ところがimplementation
が定義されていないよ的なエラーがでてGradle Syncが失敗する…
原因調べたところ、appモジュールやライブラリモジュール作成時に定義されている
apply plugin: 'com.android.application'
などの後に定義する必要があるようです。たしかにそうですね。
##解決方法
上記のapply plugin
の部分をsubprojects
に移動したのですが、1つ困った事があり、
モジュールのタイプ | プラグイン名 |
---|---|
App Moduleの場合 | com.android.application |
Android Library Moduleの場合 | com.android.library |
みたいな感じでプラグイン名を変える必要があったのでモジュール名によって判定するコードを追加しました。
subprojects {
switch (project.name) {
case 'app':
apply plugin: 'com.android.application'
break
default:
apply plugin: 'com.android.library'
break
}
dependencies {
// Koin
implementation "org.koin:koin-core:$rootProject.koin_version"
implementation "org.koin:koin-android:$rootProject.koin_version"
}
}
Java LibraryやDynamic Feature Module等を使用している場合はまた別のプラグインとなるので、
- モジュール名によって判定
- するか、モジュール名の命名規則を決めて
switch
文で正規表現を用いた判定などを行う
などの対応を行うと良いかと思います。
最初のswitch文だけ書いておけば、モジュール側のbuild.gradleに記述されている内容はほぼこちらに記載することが可能なので次のように
android
ブロックの内容などもsubprojects
で共通化すれば、app, library側のbuild.gradle
はかなりスッキリさせる事ができるのではないかなと思います。
subprojects {
switch (project.name) {
case 'app':
apply plugin: 'com.android.application'
break
default:
apply plugin: 'com.android.library'
break
}
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 27
defaultConfig {
minSdkVersion 23
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
}
kotlin {
experimental {
coroutines 'enable'
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
// Kotlin
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:0.24.0'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:0.24.0'
// Koin
implementation "org.koin:koin-core:$rootProject.koin_version"
implementation "org.koin:koin-android:$rootProject.koin_version"
}
}