DroidKaigi 2019 official appを読んでみる①:Gradle Kotlin DSL
背景
- DroidKaigi 2019 のofficial appが公開されている:参照
- せっかくだしコントリビュートしたいなと思ったけど思った以上に皆新しい技術使っててよくわからない。。
- とりあえず一つずつ理解することにする。
DroidKaigi 2019 official app のbuild.gradle
build.gradleをみてみると以下のように記載してありました。
dependencies { ・ ・ ・ implementation Dep.Kotlin.stdlibJvm api Dep.Kotlin.coroutines implementation Dep.Kotlin.androidCoroutinesDispatcher implementation Dep.OkHttp.okio }
調べてみるとKotlin-DSLとbuildSrcを利用したdependencyの管理みたいです。
もうここからよくわからないので調べてみます。
DSLとは
ドメイン特化言語(Domain Specific Language)のことで、 特定の問題解決のために専用の構文が用意されているようなことを言うみたい。
Gradleの例に当てはめて考えてみると、 今まで利用されていたのは「Groovy-DSL」、つまりビルドスクリプトを書くのにGroovy言語が専用に構文を用意してくれていたよう。
今回は、ビルドスクリプトを書くためにkotlinが専用の構文を用意してくれたのでこれを使ってみようということですね。
Gradle Kotlin DSL
DroidKaigi公式をみてみると、次のようにしています。
- build.gradleは通常通りGroovyで記載。
- ただし、dependenciesはbuildSrc/Dep.ktにまとめており、build.gradleはこちらを参照している模様。
dependencies { implementation Dep.AndroidX.Navigation.runtime implementation Dep.AndroidX.Navigation.fragment implementation Dep.AndroidX.Navigation.ui implementation Dep.AndroidX.Navigation.runtimeKtx implementation Dep.AndroidX.Navigation.fragmentKtx }
buildSrc:dependencies/Dev.kt
object Dep { object AndroidX { object Navigation { val version = "1.0.0-alpha08" val runtime = "android.arch.navigation:navigation-runtime:$version" val runtimeKtx = "android.arch.navigation:navigation-runtime-ktx:$version" val fragment = "android.arch.navigation:navigation-fragment:$version" val ui = "android.arch.navigation:navigation-ui:$version" val fragmentKtx = "android.arch.navigation:navigation-fragment-ktx:$version" val uiKtx = "android.arch.navigation:navigation-ui-ktx:$version" } } }
これはbuildSrcでのdependences管理方法で、gradleの公式ドキュメントに載ってました。
Organizing Gradle Projects
この管理をするとIDEの補完サポート(オートコンプリート)が受けられるみたいですね!
マルチモジュール化でどんどん依存関係が煩雑になってくるので、これはありがたいです。
サンプルを作成してみる。
実際に作成してみました。
- file -> new -> package で「buildSrc」パッケージを作成
- ①の構成になるようにファイルを作成
- build.gradle.ktsには②のように記載
- Dep.ktは自分の管理しやすいように。今回はDroidKaigiを真似て作成。
- Syncする
- Dep.ktを使いたいモジュールのbuild.gradleにimport dependencies.Depを記載
- Dep.ktのオブジェクトを参照可能!
①:パッケージ構成
├── build.gradle.kts(root) ├── buildSrc │ ├── build.gradle.kts │ └── src │ ├── main │ │ └── dependencies │ │ └── Dep.kt
②: build.gradle.kts
plugins { `kotlin-dsl` }
感想
できたけど、なんか以下のように補完してもらってもめっちゃ候補出てくる... 思ってたのと違う...
誰かいい感じの設定ご存知でしたら教えてください。
ハマったところ
buildSrcを通常のandroid library として生成して'com.andriod.library' not found が発生。
ktsのファイル名をgradle.ktsにしたら、他モジュールで全然参照できなかった。
- build.gradle.ktsでないとダメみたい。
sync すると Failed to notify project evaluation listener. が発生
- 当初はandroid libraryモジュールとして作成していたのでSettings.gradleにモジュール名が含まれており、これが原因だった模様。
- Settings.gradleから名前を削除したらビルドできた。
今回作成したサンプルコード
2019/1/16 追記
以下の環境にしたらbuildSrcのオブジェクトが参照できなくなった。。。
- Android Studio 3.3
- gradle-4.10.1-all.zip
謎です。わかったらまた追記します。