Slide 1

Slide 1 text

TIJCVZBBQL ʹ͜͠Γ͞ͿΖʙ!TVCSPI@ CVJME4SD$PNQPTJUF#VJMEͰඞཁͳ όʔδϣϯ৘ใ΋ 7FSTJPO$BUBMPH͔Βࢀর͍ͨ͠ʂ

Slide 2

Slide 2 text

"CPVU.F 📛ʹ͜͠Γ͞ͿΖʙࡔ্੖৴ 🏝౦ژ౎ɾҏ౾େౡग़਎ 🏆৿ཏສ৅Λ,PUMJOͰ࣮૷ͯ͠ ੈք੐෰͕͍ͨ͠ ໺๬ ‎"OESPJEΤϯδχΞ Ϧʔμʔ ‎8FCΤϯδχΞ ‎ΤϯδχΞ࠾༻

Slide 3

Slide 3 text

೥લ͕ॳࢀՃॳొஃʹͳΔ͸ͣͰͨ͠🥺 ࠓ೔͸೥ӽ͠ͷ TIJCVZBBQLϦϕϯδొஃ💪

Slide 4

Slide 4 text

͸͡Ίʹ 7FSTJPO$BUBMPHΛҰ౓Ͱ΋ ࢖ͬͨ͜ͱ͕͋Δਓ🙋

Slide 5

Slide 5 text

͸͡Ίʹ 7FSTJPO$BUBMPHΛۀ຿Ͱ ࢖͍ͬͯΔਓ🙋

Slide 6

Slide 6 text

7FSTJPO$BUBMPHͱ͸ 📚ϥΠϒϥϦɾϓϥάΠϯͷόʔδϣϯΛҰݩతʹ؅ཧ͢Δ(SBEMFͷػೳ (SBEMFͰ௥Ճ 'FBUVSF1SFWJFX ɺͰ4UBCMFʹঢ֨ ϓϩδΣΫτ͕ࢀর͢ΔͷϥΠϒϥϦɾϓϥάΠϯͷόʔδϣϯ৘ใΛ 
 ϲॴͰ؅ཧ͢Δ͜ͱ͕Ͱ͖Δ🥳 ϥΠϒϥϦɾϓϥάΠϯͷόʔδϣϯ৘ใΛܕ҆શͳܗͰࢀরͰ͖Δ🥳

Slide 7

Slide 7 text

7FSTJPO$BUBMPHͱ͸ 📚ϥΠϒϥϦɾϓϥάΠϯͷόʔδϣϯΛҰݩతʹ؅ཧ͢Δ(SBEMFͷػೳ (SBEMFͰ௥Ճ 'FBUVSF1SFWJFX ɺͰ4UBCMFʹঢ֨ ϓϩδΣΫτ͕ࢀর͢ΔͷϥΠϒϥϦɾϓϥάΠϯͷόʔδϣϯ৘ใΛ 
 ϲॴͰ؅ཧ͢Δ͜ͱ͕Ͱ͖Δ🥳 ϥΠϒϥϦɾϓϥάΠϯͷόʔδϣϯ৘ใΛܕ҆શͳܗͰࢀরͰ͖Δ🥳 ࿩͢͜ͱόʔδϣϯ؅ཧΛ7FSTJPO$BUBMPHʹҠߦͨ࣌͠ͷ5JQT ಛʹɺCVJME4SD$PNQPTJUF#VJMEͰڞ௨Խͨ͠ϏϧυεΫϦϓτ͔Β 7FSTJPO$BUBMPH؅ཧԼͷόʔδϣϯ৘ใΛͲ͏΍ͬͯࢀরͤ͞Δ͔

Slide 8

Slide 8 text

7FSTJPO$BUBMPHʹΑΔόʔδϣϯ؅ཧ 🐘settings.gradle.kts಺ʹόʔδϣϯ৘ใΛྻڍ dependencyResolutionManagement { versionCatalogs { create("libs") { version("agp", "7.3.0") version("kotlin", "1.8.0") version("androidx-core", "1.9.0") plugin("kotlin-android", "org.jetbrains.kotlin.android").versionRef("kotlin") plugin("android-application", "com.android.application").versionRef("agp") library("androidx-core", "androidx.core", "core-ktx").versionRef("androidx-core") } } } TFUUJOHTHSBEMFLUT

Slide 9

Slide 9 text

7FSTJPO$BUBMPHʹΑΔόʔδϣϯ؅ཧ 🐘gradle/libs.versions.toml಺ʹόʔδϣϯ৘ใΛྻڍ [versions] agp = "7.3.0" kotlin = "1.8.0" androidx-core = "1.9.0" [plugins] kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } android-application = { id = "com.android.application", version.ref = "agp" } [libraries] androidx-core = { module = "androidx.core:core-ktx", version.ref = "androidx-core" } HSBEMFMJCTWFSTJPOTUPNM

Slide 10

Slide 10 text

7FSTJPO$BUBMPH͔Βόʔδϣϯ৘ใࢀর 🐘͍ͣΕͷํ๏Ͱ΋ɺ֤gradle.build.kts಺ͰҎԼͷΑ͏ʹࢀরͰ͖Δ plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) } dependencies { implementation(libs.androidx.core) } HSBEMFCVJMELUT org.gradle.api.Project͔Β ֦ுϓϩύςΟlibs͕ੜ͑Δ ͔͜͜Βܕ҆શͳܗͰ όʔδϣϯ৘ใΛࢀরͰ͖Δ🥳

Slide 11

Slide 11 text

7FSTJPO$BUBMPH͔Βόʔδϣϯ৘ใࢀর 🐘UPNMϑΝΠϧͰͷ؅ཧͷ৔߹ɺ3FOPWBUFʹΑΔߋ৽νΣοΫʹରԠ👍 3FOPWBUF SFOPWBUFCPUSFOPWBUF 🚀όʔδϣϯ৘ใͷߋ৽Λݕ஌͠ɺ Ξοϓσʔτ1VMM3FRΛࣗಈ࡞੒ ʕ+BWB7FSTJPOT3FOPWBUF%PDT(SBEMF'JMF4VQQPSUEPDTSFOPWBUFCPUDPNKBWBHSBEMF fi MFTVQQPSU

Slide 12

Slide 12 text

🐥buildSrc഑ԼʹΦϒδΣΫτΫϥεΛఆٛ͠ɺόʔδϣϯ৘ใΛྻڍ object Libraries { const val agp = "7.3.0" const val kotlin = "1.8.0" const val androidxCore = "1.9.0" object Plugins { const val androidApplication = "com.android.tools.build:gradle:$agp" const val kotlinAndroid = "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin" } object AndroidX { const val core = "androidx.core:core-ktx:$androidxCore" } } ͜Ε·Ͱͷόʔδϣϯ৘ใ؅ཧ CVJME4SDTSDNBJOLPUMJO-JCSBSJFTLU ܕ҆શͳܗͰͷόʔδϣϯ৘ใࢀর͸Մೳ͕ͩʜ🤔

Slide 13

Slide 13 text

🐥buildSrc഑ԼʹΦϒδΣΫτΫϥεΛఆٛ͠ɺόʔδϣϯ৘ใΛྻڍ ͜Ε·Ͱͷόʔδϣϯ৘ใ؅ཧ plugins { `kotlin-dsl` } // 中略 dependencies { implementation(Libraries.Plugins.androidApplication) implementation(Libraries.Plugins.kotlinAndroid) } CVJME4SDHSBEMFCVJMELUT buildSrc഑Լͷgradle.build.ktsͰ ఆٛͨ͠ΦϒδΣΫτΫϥε͕ࢀরͰ͖ͳ͍🥺 buildSrc഑ԼʹϏϧυεΫϦϓτΛஔ͍ͯɺϏϧυϩδοΫͷڞ௨Խ͕Ͱ͖Δ ͔͠͠ɺόʔδϣϯ৘ใ͸ΦϒδΣΫτΫϥεΛ࢖ͬͯڞ௨ԽͰ͖ͣɺෆศ🥺 ˠ7FSTJPO$BUBMPHͰղܾՄೳʂ💪

Slide 14

Slide 14 text

⚒buildSrc$PNQPTJUF#VJME͍ͣΕͷ৔߹΋ར༻Մೳ 7FSTJPO$BUBMPHϏϧυϩδοΫڞ௨Խ pluginManagement { repositories { // 中略 includeBuild("plugins") } } TFUUJOHTHSBEMFLUT buildSrcར༻࣌ $PNQPTJUF#VJMEར༻࣌

Slide 15

Slide 15 text

⚒buildSrc$PNQPTJUF#VJME͍ͣΕͷ৔߹΋ར༻Մೳ 7FSTJPO$BUBMPHϏϧυϩδοΫڞ௨Խ pluginManagement { repositories { // 中略 includeBuild("plugins") } } TFUUJOHTHSBEMFLUT buildSrcར༻࣌ $PNQPTJUF#VJMEར༻࣌ ڞ௨Խͨ͠ ϏϧυϩδοΫ

Slide 16

Slide 16 text

⚒ settings.gradle.ktsʹUPNMϑΝΠϧͷಡΈࠐΈॲཧΛ௥ه dependencyResolutionManagement { repositories { mavenCentral() } versionCatalogs { create("libs") { from(files("../gradle/libs.versions.toml")) } } } 7FSTJPO$BUBMPHϏϧυϩδοΫڞ௨Խ CVJME4SDcQMVHJOT TFUUJOHTHSBEMFLUT

Slide 17

Slide 17 text

⚒ 7FSTJPO$BUBMPH͔Βόʔδϣϯ৘ใΛऔಘ͢Δ֦ுؔ਺Λ௥Ճ internal val VersionCatalog.androidxCore get() = getLibrary("androidx-core") internal val Project.libs: VersionCatalog get() = extensions.getByType().named("libs") private fun VersionCatalog.getLibrary( library: String, ) = findLibrary(library).get() 7FSTJPO$BUBMPHϏϧυϩδοΫڞ௨Խ CVJME4SDcQMVHJOT FYUFOTJPOT7FSTJPO$BUBMPH&YUFOTJPOLU ֦ுϓϩύςΟlibsͱόʔδϣϯ৘ใऔಘ༻ͷΫϥεɾϓϩύςΟ͕ ࣗಈੜ੒͞Εͳ͍ͨΊɺࣗྗͰ༻ҙ͢ΔඞཁΞϦ🧐

Slide 18

Slide 18 text

🛠$PNQPTFGPS.11ͷґଘؔ܎Λڞ௨Խ͢ΔΑ͏ͳϏϧυϩδοΫ plugins { id("com.android.library") id("org.jetbrains.compose") kotlin("multiplatform") } kotlin { jvm("desktop") android() sourceSets { commonMain { dependencies { implementation(compose.runtime) implementation(compose.foundation) implementation(compose.material3) } } named("androidMain") { dependencies { implementation(libs.androidxCore) } } } } CVJME4SDcQMVHJOT DPNQPTFDPNNPOHSBEMFLUT CVJME4SDcQMVHJOT CVJMEHSBEMFLUT͔Β όʔδϣϯ৘ใΛࢀর

Slide 19

Slide 19 text

🛠$PNQPTFGPS.11ͷґଘؔ܎Λڞ௨Խ͢ΔΑ͏ͳϏϧυϩδοΫ plugins { id("com.android.library") id("org.jetbrains.compose") kotlin("multiplatform") } kotlin { jvm("desktop") android() sourceSets { commonMain { dependencies { implementation(compose.runtime) implementation(compose.foundation) implementation(compose.material3) } } named("androidMain") { dependencies { implementation(libs.androidxCore) } } } } CVJME4SDcQMVHJOT DPNQPTFDPNNPOHSBEMFLUT plugins { id("compose-common") } DPNNPOCVJMEHSBELFLUT $PNQPTFGPS.11ͱBOESPJEYDPSFLUY΁ͷ ґଘΛQMVHJOTͷ௥Ճ͚ͩͰఆٛͰ͖Δʂ🥳 ܁Γฦ͠ॻ͖͕ͪͳґଘؔ܎Λ ͭͷϑΝΠϧʹ·ͱΊͯ؅ཧͰ͖Δ🥰 ͦͷ্ߋ৽νΣοΫ΋ࣗಈͰͰ͖Δ🥰 %BHHFS 
 $PSPVUJOFT 
 ࣗಈςετؔ࿈FUD $PNQPTFGPS.11 BOESPJEYDPSFLUY

Slide 20

Slide 20 text

·ͱΊ ⭐7FSTJPO$BUBMPHͰόʔδϣϯ৘ใΛεϚʔτʹ؅ཧ͢Δํ๏Λ঺հ όʔδϣϯ৘ใͷߋ৽ͷෛ୲Λେ͖ܰ͘ݮ👍 ڞ௨Խͨ͠ϏϧυϩδοΫ͔Β΋গͳ͍هड़Ͱόʔδϣϯ৘ใΛࢀর👍 👀ίʔυΛ࣮ࡍʹ৮Γͳ͕Β֬ೝ͍ͨ͠ํ͸ʜ TVCSPIWFSTJPODBUBMPHTBNQMF CVJME4SD൛buildSrcλά$PNQPTJUF#VJME൛CompositeBuildλά 7FSTJPO$BUBMPHΛ࢖ͬͯɺΈͳ͞Μ΋ %FWFMPQFS&9QFSJFODF޲্ʂ💪 5IBOLZPVGPSMJTUFOJOH