مستودع أحادي مع Kotlin: تنظيم الكود للمبتدئين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: ما هو المستودع الأحادي ولماذا يحتاجه مطور Kotlin



المستودع الأحادي (monorepo) هو نهج يتم فيه تخزين كود عدة مشاريع أو وحدات في مستودع واحد. في سياق Kotlin، هذا مناسب بشكل خاص: يمكنك دمج الجزء الخادم (Ktor)، والمكتبات، وأدوات CLI، وحتى تطبيقات الهاتف المحمول (Kotlin Multiplatform) في هيكل واحد. بالنسبة للمطورين المبتدئين، يبسط المستودع الأحادي التنقل والاختبار والعمل الجماعي.



في هذه المقالة، سنشرح كيفية تنظيم مستودع أحادي مع Kotlin باستخدام Gradle Multi-Project Build. ستتعلم كيفية هيكلة المجلدات بشكل صحيح، وتكوين التبعيات، وتجنب الأخطاء الشائعة.



الجزء الرئيسي: إنشاء مستودع أحادي مع Kotlin



1. هيكل المستودع الأحادي: المبادئ الأساسية



الهيكل الصحيح هو مفتاح النجاح. في المستودع الأحادي Kotlin، كل وحدة هي مشروع فرعي منفصل لـ Gradle. إليك مخطط نموذجي:



my-monorepo/├── build.gradle.kts          # ملف البناء الجذر├── settings.gradle.kts       # إعداد الوحدات├── gradle.properties         # الخصائص المشتركة├── shared/                   # مكتبة مشتركة (وحدة)│   ├── build.gradle.kts│   └── src/│       └── main/│           └── kotlin/│               └── com/example/shared/│                   └── Utils.kt├── backend/                  # وحدة الخادم (Ktor)│   ├── build.gradle.kts│   └── src/│       └── main/│           └── kotlin/│               └── com/example/backend/│                   └── Application.kt└── cli-tool/                 # أداة CLI    ├── build.gradle.kts    └── src/        └── main/            └── kotlin/                └── com/example/cli/                    └── Main.kt


القاعدة الأساسية: وحدة واحدة - مسؤولية واحدة. لا تخلط منطق الأعمال والبنية التحتية في وحدة واحدة. هذا يبسط الاختبار وإعادة استخدام الكود.



2. إعداد Gradle للمستودع الأحادي



لنبدأ بالملف الجذر settings.gradle.kts. يحدد الوحدات التي يتضمنها المشروع:



// settings.gradle.ktsrootProject.name = "my-monorepo"

include(":shared")include(":backend")include(":cli-tool")

// اختياري: يمكن تعيين أسماء الوحدات عبر include()// include(":libs:utils") — إذا كانت الوحدة متداخلة في مجلد libs


الآن الملف الجذر build.gradle.kts. عادةً ما يحتوي فقط على الإعدادات العامة (الإضافات، المستودعات) وليس له كود خاص به:



// build.gradle.kts (جذر)plugins {    kotlin("jvm") version "1.9.22" apply false    id("application") apply false}

allprojects { repositories { mavenCentral() }}

subprojects { apply(plugin = "kotlin") // إعدادات مشتركة لجميع المشاريع الفرعية dependencies { implementation(kotlin("stdlib")) }}


لاحظ apply false - هذا يمنع تطبيق الإضافة على المشروع الجذر. كل وحدة تقرر بنفسها الإضافات التي تحتاجها.



3. مثال وحدة: مكتبة مشتركة (shared)



ستحتوي وحدة shared على دوال قابلة لإعادة الاستخدام. ملف build.gradle.kts الخاص بها:



// shared/build.gradle.ktsplugins {    kotlin("jvm")}

dependencies { // لا تبعيات داخلية - هذه وحدة أساسية testImplementation("org.jetbrains.kotlin:kotlin-test")}


الكود نفسه في Utils.kt:



// shared/src/main/kotlin/com/example/shared/Utils.ktpackage com.example.shared

fun greet(name: String): String = "Hello, $name!"

fun add(a: Int, b: Int): Int = a + b


الآن يمكن ربط هذه الوحدة بوحدات أخرى:



// backend/build.gradle.ktsplugins {    kotlin("jvm")    id("application")}

dependencies { implementation(project(

المدونات

توصيات الكتب