Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
build.gradle.ktsの内容を モジュール間で共有化する
Search
Takafumi Kanda
April 12, 2019
Technology
960
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
build.gradle.ktsの内容を モジュール間で共有化する
Takafumi Kanda
April 12, 2019
More Decks by Takafumi Kanda
See All by Takafumi Kanda
FlutterでのMaterial You対応の状況と今後の展望 / The status and plan of Flutter's Material You support
kafumi
2
5.4k
Other Decks in Technology
See All in Technology
SSFの現在地 ― CAEP/RISCからAI Identityへ
oidfj
0
280
AWS Quick 入門 | 目指せ Quick マスター 01
inariku
PRO
2
230
超⼩型・多⾔語検索モデル Bekko Embedding
hotchpotch
1
130
Kiro IDE 入門 (画面の各部から、頼み方、任せ方、戻し方まで) | 目指せ Kiro マスター 02
inariku
PRO
4
150
AWSを利用する上で知っておきたい名前解決の話 2026
nagisa53
5
3.3k
AI時代に求められる優秀なTechLeadの振る舞い
pospome
11
15k
「AIチャットからもできないの?」と言われたら ~業務アプリをMCP対応するときの認証・認可の勘所
oidfj
0
220
視野はAIに、視座は人に / ai-for-breadth-humans-for-perspective
nkzn
6
3.2k
Active Directory と Entra ID のむむむな関係
murachiakira
PRO
4
1.7k
AI Agent 時代のデータ基盤: ClickHouse で実現する 超高速分析とコスト削減の両立
jozono
0
220
Sizing, Benchmarking and Performance Tuning Apache Flink Clusters
rmetzger
0
140
AX時代の自治体支援リソース再配分と役割分担の再構成:戦略とロードマップ(概要)
sishi2026
0
200
Featured
See All Featured
How Software Deployment tools have changed in the past 20 years
geshan
3
35k
From π to Pie charts
rasagy
1
440
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
480
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
800
Site-Speed That Sticks
csswizardry
13
1.6k
Embracing the Ebb and Flow
colly
88
5.2k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
680
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
520
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
Transcript
build.gradle.ktsͷ༰Λ ϞδϡʔϧؒͰڞ༗Խ͢Δ @kafumi
ࣗݾհ • ਆా ਸ࢙ (͔Μͩ ͔ͨ;Έ) • Twitter: @kafumi__ •
GitHub: @kafumi • ࢈ࣗಈंגࣜձࣾ @ தࠇ • όοΫΤϯυɾiOSɾAndroidΤϯδχΞઈࢍืूத
ࠓͷ • ϚϧνϞδϡʔϧϓϩδΣΫτͰ • GradleεΫϦϓτͷهड़ʹKotlin DSLΛ͍ͬͯΔ߹ʹ • GradleεΫϦϓτͷ༰ΛϞδϡʔϧؒͰͲ͏ͬͯ ڞ௨Խ͢Δ͔
αϯϓϧίʔυ • https://github.com/kafumi/android-kotlin-gradle-sample • ํ๏1: Kotlin֦ுؔΛ͏ํ๏ kotlin-extϒϥϯν • ํ๏2: precompiled
script pluginΛ͏ํ๏ precompiled-scriptϒϥϯν
ఆ͢ΔϓϩδΣΫτ :app :featureA :featureB :data :model • τοϓϨϕϧͷΞϓϦϞδϡʔϧ • ApplicationΫϥεɺDIͷઃఆͳͲΛ͢Δ
• ػೳ͝ͱʹׂ͞ΕͨػೳϞδϡʔϧ • ͍ΘΏΔPresentationͷΫϥεؚ͕·ΕΔ • σʔλI/OΛ࣮͢Δ • ϞδϡʔϧؒͰڞ༗͍ͨ͠σʔλΫϥεΛ ఆٛ͢Δ
ఆ͢ΔϓϩδΣΫτ :app :featureA :featureB :data :model • τοϓϨϕϧͷΞϓϦϞδϡʔϧ • ApplicationΫϥεɺDIͷઃఆͳͲΛ͢Δ
• ػೳ͝ͱʹׂ͞ΕͨػೳϞδϡʔϧ • ͍ΘΏΔPresentationͷΫϥεؚ͕·ΕΔ • σʔλI/OΛ࣮͢Δ • ϞδϡʔϧؒͰڞ༗͍ͨ͠σʔλΫϥεΛ ఆٛ͢Δ
buildSrcΛ͏ • buildSrc • ࣗಈతʹίϯύΠϧ͞Εͯɺશ ϞδϡʔϧͷGradleεΫϦϓτ ͷґଘઌͱͯ͠ΘΕΔ • ͭ·ΓɺbuildSrcͰఆٛͨ͠ ͷɺશϞδϡʔϧͷGradle
εΫϦϓτ͔Β͑Δ
ྫ: DependencyఆٛΛ ఆͱͯ͠ڞ௨Խ͢Δ object Versions { !// … !//
Google libraries const val appCompat = "1.0.2" const val constraintLayout = "1.1.3" const val lifecycle = "2.0.0" !// 3rd-party libraries const val timber = "4.7.1" } object Deps { !// … object AndroidX { const val appCompat = "androidx.appcompat:appcompat:${Versions.appCompat}" const val constraintLayout = "androidx.constraintlayout:constraintlayout:$ {Versions.constraintLayout}" const val lifecycle = "androidx.lifecycle:lifecycle-extensions:${Versions.lifecycle}" } !// … } buildSrc/src/main/kotlin/Dependencies.kt
ྫ: DependencyఆٛΛ ఆͱͯ͠ڞ௨Խ͢Δ dependencies { implementation(project(":featureA")) !// Kotlin implementation(Deps.Kotlin.stdlibJdk) !//
Debug utilities implementation(Deps.Debug.timber) } app/build.gradle.kts featureA/build.gradle.kts dependencies { implementation(project(":data")) implementation(project(":model")) !// Kotlin implementation(Deps.Kotlin.stdlibJdk) !// AndroidX implementation(Deps.AndroidX.appCompat) implementation(Deps.AndroidX.constraintLayout) implementation(Deps.AndroidX.lifecycle) !// Debug utilities implementation(Deps.Debug.timber) }
None
ͬͱڞ௨Խ͍ͨ͠
buildSrcΛͬͱ͏ • ํ๏1: ڞ༗෦ΛbuildSrcʹ֦ுؔͱͯ͠ఆٛ͢Δ • ํ๏2: ڞ༗෦ΛPrecompiled script pluginͱͯ͠ఆٛ͢ Δ
ํ๏1: ֦ுؔ https://inside.pixiv.blog/makun/6409
ํ๏1: ֦ுؔ fun KotlinBuildScript.applyAndroidLibrary() { androidLibrary { compileSdkVersion(Versions.compileSdk) buildToolsVersion(Versions.buildTools) defaultConfig
{ minSdkVersion(Versions.minSdk) targetSdkVersion(Versions.targetSdk) } compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } buildTypes { getByName("release") { isMinifyEnabled = false consumerProguardFile(file("proguard-rules.pro")) } } libraryVariants.all { generateBuildConfigProvider!?.configure { isEnabled = false } } } buildSrc/src/main/kotlin/AndroidConfigurations.kt GradleεΫϦϓτ KotlinBuildScriptΫϥεͷϝ ιουͱ࣮ͯ͠ߦ͞Ε͍ͯΔ ͷͰɺಉΫϥεͷ֦ுؔͱ ͯ͠ڞ༗෦Λఆٛ
ํ๏1: ֦ுؔ fun KotlinBuildScript.applyAndroidLibrary() { androidLibrary { compileSdkVersion(Versions.compileSdk) buildToolsVersion(Versions.buildTools) defaultConfig
{ minSdkVersion(Versions.minSdk) targetSdkVersion(Versions.targetSdk) } compileOptions { … buildSrc/src/main/kotlin/AndroidConfigurations.kt ϓϥάΠϯ͕ఏڙ͢ΔΫϥε ͷΞΫηα͕ࣗಈੜ͞Ε ͳ͍ͷͰɺࣗͰఆٛ͢Δඞ ཁ͕͋Δ internal fun Project.android(configure: BaseAppModuleExtension.() !-> Unit): Unit = (this as ExtensionAware).extensions.configure("android", configure) internal fun Project.androidLibrary(configure: LibraryExtension.() !-> Unit): Unit = (this as ExtensionAware).extensions.configure("android", configure) internal fun Project.kotlin(configure: KotlinProjectExtension.() !-> Unit): Unit = (this as ExtensionAware).extensions.configure("kotlin", configure) buildSrc/src/main/kotlin/Accessors.kt
ڞ༗෦Λ applyAndroidLibrary() ݺͼग़͠ʹஔ͖͑ΒΕΔ
͕ࠩ͋Δͱ͜Ζ͚ͩɺ֤ϞδϡʔϧͷεΫϦϓτʹॻ͚Α͘ͳΔ
͕ࠩ͋Δͱ͜Ζ͚ͩɺ֤ϞδϡʔϧͷεΫϦϓτʹॻ͚Α͘ͳΔ plugins෦ ڞ༗ԽͰ͖ͳ͍͔
ํ๏2: Precompiled script plugin • buildSrcͷ *.gradle.kts ֦ுࢠͷϑΝΠϧɺϓϥάΠ ϯͱͯ͠ίϯύΠϧ͞ΕΔ •
௨ৗͷ build.gradle.kts ͱಉ͡ه๏͕͑Δ • plugins (ଞͷϓϥάΠϯͷ apply) ఆٛͰ͖Δ • Gradle 5.3͔Β (͖ͬͨ͞͠Α͏ͳ) ΞΫηα͕ࣗಈੜ ͞ΕΔΑ͏ʹͳͬͨʂ
ํ๏2: Precompiled script plugin import org.gradle.api.JavaVersion plugins { id("com.android.library") id("kotlin-android")
} android { compileSdkVersion(Versions.compileSdk) buildToolsVersion(Versions.buildTools) defaultConfig { minSdkVersion(Versions.minSdk) targetSdkVersion(Versions.targetSdk) } compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } buildTypes { getByName("release") { isMinifyEnabled = false consumerProguardFile(file("proguard-rules.pro")) } } ↗ ʹଓ͘ ↙ ͔Βଓ͘ libraryVariants.all { generateBuildConfigProvider!?.configure { isEnabled = false } } } kotlin { sourceSets.all { languageSettings.progressiveMode = true } } buildSrc/src/main/kotlin/ android-library.gradle.kts
ڞ༗෦Λ `android-library` ϓϥάΠϯͷ apply ʹஔ͖͑ΒΕΔ
·ͱΊ • ϞδϡʔϧؒͰbuild.gradle.ktsͷ༰Λڞ௨Խ͢Δʹओ ʹ2ͭͷํ๏͕͋Δ • ํ๏1: ڞ༗෦ΛbuildSrcʹ֦ுؔͱͯ͠ఆٛ͢Δ • ํ๏2: ڞ༗෦ΛPrecompiled
script pluginͱͯ͠ఆٛ ͢Δ • Gradle 5.3Ҏ߱Ͱ͋Εɺํ๏2ͷ΄͏͕Αͦ͞͏