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

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

Avatar for bigbackboom bigbackboom
July 11, 2024
47

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

Avatar for bigbackboom

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に引っ張られている可能性があるのでログを要チェック。