آموزش Kotlin Multiplatform(قسمت اول)

فصل اول کتاب رو- چون یکم طولانی بود- توی دو قسمت منتشر میکنم. تو این پست، فصل اول(قسمت اول) این کتاب رو بررسی میکنیم و:* درباره build system های KMP حرف میزنیم.AndroidCornerنکته: اگه پست "مقدمه" رو ندیدین، حتما تو کانال Android Corner ببینید.فصل اول قسمت اول:برای شروع کار، ما باید با build system ای که KMP استفاده میکنه آشنا بشیم: build system اندروید و دکستاپ همون gradle ولی iOS از CocoaPods استفاده میکنه.گریدلخود KMP از اسکریپ های kotlin استفاده میکنه برای gradle و اگه ببین پسوند فایلش .kts هست مخفف kotlin script.فایل های Buildتوی پوشه روت build.gradle.kts باز کنید:// 1 buildscript { // 2 repositories { gradlePluginPortal() google() mavenCentral() } // 3 dependencies { classpath(&quotorg.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31&quot) classpath(&quotcom.android.tools.build:gradle:7.0.1&quot) } }1- بخش buildscript همه اطلاعات مربوط به پلاگین ها و ورژن هاشون رو تعریف میکنه.2- بخش repositories منبعی که پلاگین ها روش هاست شدن رو تعریف میکنه.3- و توی dependencies هم ما میایم پلاگین ها رو قرار میدیم.اینم هست:// 1 allprojects { // 2 repositories { google() mavenCentral() } }1- بخش AllProjects به این معنیه: که موارد زیر رو برای همه ماژول های این پروژه اعمال کن.2- بخش repositories تمامی مخزن های مورد نیاز برای همه ماژولا رو تعریف می کنه.آخرین بخش:tasks.register(&quotclean&quot, Delete::class) { delete(rootProject.buildDir) }این یه وظیفه Gradle به نام Clean انجام میده که با این کار، پوشه root رو حذف میکنه و در فقط صورت نیاز به build تازه(fresh build) از این استفاده می کنید.حالا androidApp/build.gradle.kts رو باز کنید، این فک کنم براتون آشناست:) توش پلاگین ها، dependency ها و بلاک اندروید(چیزای مخصوص اندروید) قرار داره.اما توی قسمت dependency :dependencies { // 1 implementation(project(&quot:shared&quot)) // 2 implementation(&quotcom.google.android.material:material:1.4.0&quot) implementation(&quotandroidx.appcompat:appcompat:1.3.1&quot) implementation(&quotandroidx.constraintlayout:constraintlayout:2.1.1&quot) }1- این میگه که اندروید وابسته اس به ماژول shared(جاییکه منطق بیزینس و network و database و .. قرار داره)2- اینا هم که dependency های مخصوص اندروید اندفایل build ماژول sharedحالا فایل shared/build.gradle.kts رو باز کنید.اولین بخش پلاگین ها هستن:plugins { kotlin(&quotmultiplatform&quot) kotlin(&quotnative.cocoapods&quot) id(&quotcom.android.library&quot) }* اولی پلاگین برای KMP هستش و میگه که این ماژول یه ماژول برای چند پلتفرمه (multiplatform).* دومی پلاگین CocoaPods برای IOS .* سومی هم که برای اندرویده؛ شما اینو استفاده میکنید به منظور ساخت یه لایبرری اندروید(همون کدهایی که تو shared) برای استفاده تو Android app تون.بخش kotlin:kotlin { // 1 android() // 2 iosX64() // 3 iosArm64() // 4 iosSimulatorArm64() // 5 cocoapods { summary = &quotHolds Time zone information&quot homepage = &quotLink to the Shared Module homepage&quot ios.deploymentTarget = &quot14.1&quot framework { baseName = &quotshared&quot } podfile = project.file(&quot../iosApp/Podfile&quot) } ... }این بخش از پلاگین multiplatform استفاده میکنه به منظور پیکربندی این ماژول برای KMP.1- این متد برای هدف قرار دادن اندروید بعنوان پلتفرمیه که داریم براش این پروژه رو مینویسیم.2- متد iOSX64 برای هدف قرار دادن iOS با معماری x86_64 هستش، مثل شبیه سازهای iOS ای که اجرا میشن روی دستگاه های Mac.3- متد iosArm64 هم هدفش دستگاه های IOS ای هستش که مبتنی بر معماری ARM64 هستن.4- این متد هم iosSimulatorArm64 برای هدف قرار دادن شبیه ساز iOS هستش که معماری ARM64 را در دستگاه های x86_64 تقلید می کند.5- این یه سری جزئیات برای ساخت CocoaPods Podfile(توی پوشه ios) تعریف میکنهبخش بعدی sourcsSet:sourceSets { // 1 val commonMain by getting val commonTest by getting { dependencies { implementation(kotlin(&quottest-common&quot)) implementation(kotlin(&quottest-annotations-common&quot)) } } // 2 val androidMain by getting val androidTest by getting { dependencies { implementation(kotlin(&quottest-junit&quot)) implementation(&quotjunit:junit:4.13.2&quot) } } // 3 val iosX64Main by getting val iosArm64Main by getting val iosSimulatorArm64Main by getting val iosMain by creating { dependsOn(commonMain) iosX64Main.dependsOn(this) iosArm64Main.dependsOn(this) iosSimulatorArm64Main.dependsOn(this) } }تو این بخش ما، source set هامون رو با variable های از پیش تعریف شده میتونیم تعریف کنیم.1- این commonMain و dependency هایی برای تست کردن تعریف میکنه- برای commonMain چیزی تعریف نکرده.2- این dependency های اندروید رو تعریف میکنه.3- اینجا هم dependency های IOS.بخش بعدی هم اندرویده که شما باهاش آشنا هستید.android { compileSdk = 31 sourceSets[&quotmain&quot].manifest.srcFile(&quotsrc/androidMain/AndroidManifes t.xml &quot) defaultConfig { minSdk = 21 targetSdk = 31 } }سیستم عامل iOSخب، iOS برخلاف اندروید از چند سیستم مدیریت dependency استفاده میکنه که یکی از معمول ترینش CocoaPods هستش.اگه برین iOSApp/Podfile رو باز کنید، چیز زیادی نداره:target 'iosApp' do use_frameworks! platform: ios, '14.1' pod 'shared',: path => '../shared' endمهمترین قسمتش :اینه: pod 'shared', :path => '../shared'این قسمت میاد فریمورک shred ای که قراره KMP بسازه رو تعریف میکنه (واقعا یه فریمورک کوچیکه دیگه).خُبب! این قسمت دوم بود. امیدوارم خوشتون اومده باشه، اگه نظری، پیشنهادی، باگی چیزی بود لطفا تو کامنت ها به اشتراک بذارین.کانال تلگرام Android Corner