بنية مشروع KMP: commonMain وandroidMain وiosMain
تعرّف على تسلسل مجموعات المصدر وكيفية مشاركة الشيفرة بين الأهداف.
بنية مشروع KMP: commonMain وandroidMain وiosMain درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ما المقصود بـ KMP؟
يتيح Kotlin Multiplatform (KMP) كتابة شيفرة Kotlin مشتركة تُترجم إلى JVM وAndroid وiOS عبر Kotlin/Native وJS. وتوجد الشيفرة الخاصة بكل منصة في source set منفصل.
// Typical KMP module structure:
// shared/
// src/
// commonMain/kotlin/ <- shared code
// androidMain/kotlin/ <- Android-only
// iosMain/kotlin/ <- iOS-only
// commonTest/kotlin/ <- shared tests
fun main() { println("KMP: one codebase, many targets") }تسلسل source set
تكوّن source sets تسلسلًا هرميًا. إذ يمثل commonMain الجذر، بينما يعتمد عليه androidMain وiosMain. وتكون الشيفرة الموجودة في commonMain مرئية لجميع الأهداف.
// build.gradle.kts (Kotlin DSL)
kotlin {
androidTarget()
iosX64()
iosArm64()
iosSimulatorArm64()
sourceSets {
val commonMain by getting {
dependencies { /* shared deps */ }
}
val androidMain by getting
val iosMain by getting
}
}commonMain: المنطق المشترك
ضع منطق الأعمال، ونماذج المجال، والمستودعات، وحالات الاستخدام في commonMain. تُترجم هذه الشيفرة لجميع الأهداف.
// commonMain/kotlin/com/example/domain/User.kt
data class User(val id: String, val name: String, val email: String)
// commonMain/kotlin/com/example/repository/UserRepository.kt
interface UserRepository {
suspend fun getUser(id: String): User?
suspend fun saveUser(user: User)
}androidMain: خاص بـ Android
يمكن لـandroidMain استخدام فئات Android SDK. ومن الاستخدامات المعتادة توفير تطبيقات خاصة بـAndroid لتصريحات expect/actual.
// androidMain/kotlin/com/example/platform/PlatformLogger.kt
import android.util.Log
class AndroidLogger : Logger {
override fun log(msg: String) = Log.d("App", msg)
}
// androidMain/kotlin/com/example/di/PlatformModule.kt
// Koin or Hilt module that binds AndroidLogger to LoggeriosMain: خاص بـ iOS
يتيح iosMain الوصول إلى أطر Apple باستخدام التكامل البيني لـKotlin/Native. استخدمه لتوفير تطبيقات iOS لواجهات برمجة التطبيقات expect/actual.
// iosMain/kotlin/com/example/platform/PlatformLogger.kt
import platform.Foundation.NSLog
class IosLogger : Logger {
override fun log(msg: String) = NSLog(msg)
}
// iOS uses Kotlin/Native runtime; no JVM hereإعداد Gradle لأهداف iOS
بالنسبة إلى iOS، تعلن عادةً عن ثلاثة أهداف: x64 للمحاكي على Intel، وarm64 للجهاز، وsimulatorArm64 للمحاكي على Apple Silicon.
// build.gradle.kts
kotlin {
iosX64()
iosArm64()
iosSimulatorArm64()
sourceSets {
val iosMain by creating {
dependsOn(commonMain.get())
}
val iosX64Main by getting { dependsOn(iosMain) }
val iosArm64Main by getting { dependsOn(iosMain) }
val iosSimulatorArm64Main by getting { dependsOn(iosMain) }
}
}التبعيات المشتركة في commonMain
أضف التبعيات المشتركة مثل Ktor وSQLDelight وkotlinx.serialization وKoin إلى commonMain. أما برامج التشغيل الخاصة بالمنصة، فضعها في source sets الخاصة بالمنصة.
// commonMain dependencies example:
// implementation("io.ktor:ktor-client-core:2.3.0")
// implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1")
// implementation("io.insert-koin:koin-core:3.4.0")
// androidMain:
// implementation("io.ktor:ktor-client-okhttp:2.3.0")
// iosMain:
// implementation("io.ktor:ktor-client-darwin:2.3.0")commonTest: الاختبارات المشتركة
تعمل الاختبارات الموجودة في commonTest على جميع الأهداف. استخدم مكتبة اختبار Kotlin، واكتب اختبارات وحدة مستقلة عن الهدف لمنطق الأعمال المشترك.
// commonTest/kotlin/UserRepositoryTest.kt
import kotlin.test.Test
import kotlin.test.assertEquals
class UserRepositoryTest {
@Test
fun testUserCreation() {
val user = User("1", "Alice", "alice@example.com")
assertEquals("Alice", user.name)
}
}source sets الوسيطة
يمكنك إنشاء source sets وسيطة مشتركة بين مجموعة فرعية من الأهداف، مثل nativeMain لجميع الأهداف الأصلية، أو appleMain لكل من iOS وmacOS.
// Create appleMain shared between iOS and macOS:
sourceSets {
val appleMain by creating { dependsOn(commonMain.get()) }
val iosMain by getting { dependsOn(appleMain) }
val macosMain by getting { dependsOn(appleMain) }
}تنظيم ملفات المشروع
شجرة أدلة نموذجية لوحدة KMP مشتركة تفصل المسؤوليات بوضوح.
// shared/
// build.gradle.kts
// src/
// commonMain/kotlin/
// domain/ User.kt, Post.kt
// repository/ UserRepository.kt
// usecase/ GetUserUseCase.kt
// androidMain/kotlin/
// repository/ RoomUserRepository.kt
// iosMain/kotlin/
// repository/ CoreDataUserRepository.kt
// commonTest/kotlin/ GetUserUseCaseTest.ktتكامل CocoaPods / SPM
ينشئ KMP Gradle plugin ملف XCFramework، أو pod خاصًا بـCocoaPods، تضيفه إلى مشروع Xcode، ليعرض شيفرة Kotlin المشتركة على هيئة native framework.
// build.gradle.kts for CocoaPods:
kotlin {
cocoapods {
name = "Shared"
version = "1.0"
ios.deploymentTarget = "14.0"
framework { baseName = "Shared" }
}
}
// Run: ./gradlew :shared:podPublishReleaseXCFrameworkتحقق سريع
أين ينبغي وضع منطق الأعمال المشترك، مثل نماذج المجال وحالات الاستخدام، في مشروع KMP؟
مراجعة
يحتوي commonMain على المنطق المشترك، بما في ذلك المجال والمستودعات وحالات الاستخدام. ويحتوي androidMain/iosMain على تطبيقات المنصة. أما commonTest فيشغّل الاختبارات على جميع الأهداف. تُقسّم التبعيات بحيث توضع واجهات API المشتركة في commonMain، وبرامج التشغيل الخاصة بالمنصة في source sets الخاصة بها.
الأسئلة الشائعة
هل درس «بنية مشروع KMP: commonMain وandroidMain وiosMain» مجاني؟
نعم — نص درس «بنية مشروع KMP: commonMain وandroidMain وiosMain» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ماذا ستتعلم في «بنية مشروع KMP: commonMain وandroidMain وiosMain»؟
تعرّف على تسلسل مجموعات المصدر وكيفية مشاركة الشيفرة بين الأهداف. تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟
لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «بنية مشروع KMP: commonMain وandroidMain وiosMain»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟
نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- بنية مشروع KMP: commonMain وandroidMain وiosMain
- آلية expect/actual لواجهات برمجة المنصات
- مشاركة طبقتَي Repository وUse Case
- حقن الاعتماديات في KMP باستخدام Koin