Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Pay for Businessのgradle.ktsへの移行の小噺

bigbackboom
July 11, 2024
28

Pay for Businessのgradle.ktsへの移行の小噺

bigbackboom

July 11, 2024
Tweet

More Decks by bigbackboom

Transcript

  1. Pay for Businessとは? プロダクトの技術的な特徴: • リリースから2年の新しめのプロジェクト • 技術的特徴 ◦ Jetpack

    ComposeでUIを全て作成 ◦ ダークモードに対応済み ◦ Kotlin coroutine・Flowなどモダンな言語機能を利用 • 未対応箇所 ◦ gradleがGroovy ← 今日のトピック ◦ In-App Review / In-App Updateなどは未対応
  2. GroovyのlambdaとKotlinからの呼び出し buildscript { ext { enableJacoco = { Project project,

    String variant -> // Jacocoの設定周りを記述 } } } • トップレベルのgradleにJacoco設定用のClosureが定義されている。 • 各モジュールで、Closureを呼び出して、全てのモジュールで同じ Jacocoの設定を適用する。 build.gradle(project_name)
  3. GroovyのlambdaとKotlinからの呼び出し build.gradle(:features:common) plugins { alias libs.plugins.android.library alias libs.plugins.kotlin.android alias libs.plugins.kotlin.parcelize

    } enableJacoco(project, 'Debug') plugins { alias(libs.plugins.android.library) alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.kapt) } rootProject.project.ext["enableJacoco"]( project, 'debug' ) build.gradle.kts(:features:common) • build.gradleをktsに置き換えて Closureを呼び出そうと思いました。 • extからデータを取り出して呼び出してみたが、 syntaxエラーとなる
  4. GroovyのlambdaとKotlinからの呼び出し • 結局、試行錯誤してもわからず、 Gradle Pluginを作る方針に変更 • nowinandroidに倣い、build-logicというプラグイン専用の独立プロジェクトを立てて、そちらを呼び出す 形に変更 • 下記のようにプロジェクトファイルを構成

    pay_project ├ build-logic/ ├ convention/ ├ src/main/kotlin/com/moenyeforward/pay_project/build/logic ├ Jacoco.kt └ ProjectExtension.kt ├ AndroidJacocoConventionPlugin └ build.gradle.kts └ settings.gradle ├ app/ . .
  5. GroovyのlambdaとKotlinからの呼び出し • モジュールそのものの書き方は省きま す。 • build-logic/convention/build.gradle.kts にpluginの登録をしておく。 • 対象モジュールの、pluginsにidを設定 しておけばビルド時に自動で動く

    Tips: build-logicではなくて、buildSrcでも可能だが、実は buildSrcは1行でも変更すると全モジュールに再ビルド がかかる ので効率が良くない *1。 // build-logic/convention/build.gradle.kts gradlePlugin { plugins { register("androidJacoco" ) { // なんでもいいけど、呼び出し用のユニークな名前 id = "bizpay.android.jacoco" // クラス名 implementationClass = "AndroidJacocoConventionPlugin"   } } } // Jacocoの設定対象モジュールの plugins { alias(libs.plugins.android.library) alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.kapt) id("bizpay.android.jacoco") }
  6. Gradleのビルドバージョンが下がる謎現象 • Pay for Businessのビルドツール ◦ Gradle Plugin: 8.0.2 ◦

    Gradle Version: 8.2.1 • 最新に近いバージョンが利用されている • そんな中、AppモジュールのKTS移行で異変が・・・・
  7. Gradleのビルドバージョンが下がる謎現象 • androidx.navigation.safeargs. kotlinを入れると、Gradle 7.0.4が 使われてしまうことが発覚 • 原因はモジュール間でのバージョ ン固定のための設定の記述漏れ でした

    // build.gradle.kts(:app) plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.kapt) alias(libs.plugins.hilt) // ⇩androidx.navigation.safeargs.kotlin // alias(libs.plugins.androidx.navigation.safeargs.kotlin) alias(libs.plugins.google.services) alias(libs.plugins.firebase.crashlytics) alias(libs.plugins.firebase.perf) } // build.gradle.kts(:pay_project) plugins { alias(libs.plugins.androidx.navigation.safeargs.kotlin) apply false . . . }
  8. Gradleのビルドバージョンが下がる謎現象 • KTSではclasspathなどのバージョン を示す記述が完全になくなり 、plugins とversionの二つのタグだけで、 plugin 利用する形になっている。 • トップレベルのモジュールで

    apply falseとversionをつけることで全モ ジュールでのバージョン固定をする • その記述を忘れていたことで、おかし な挙動をしていた。 // build.gradle.kts(:app) plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.kapt) alias(libs.plugins.hilt) // ⇩androidx.navigation.safeargs.kotlin // alias(libs.plugins.androidx.navigation.safeargs.kotlin) alias(libs.plugins.google.services) alias(libs.plugins.firebase.crashlytics) alias(libs.plugins.firebase.perf) } // build.gradle.kts(:pay_project) plugins { alias(libs.plugins.androidx.navigation.safeargs.kotlin) apply false . . . }
  9. まとめ • Kotlin → GroovyのClosure呼び出しの仕方がわからない • Closure呼び出しするよりも、Plugin化すると便利。 • Pluginを別プロジェクト(build-logic)として切ると、ビルド時間も短縮 •

    KTSではまだ謎の挙動が起きることがある。 ◦ Gradleのバージョンが特定モジュールだけ変わる • Pluginやdependencyに引っ張られている可能性があるのでログを要チェック。