مستودع أحادي مع Rust: تنظيم الكود عمليًا

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

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

ابدأ الدورة

مستودع أحادي مع Rust: تنظيم الكود عمليًا

المستودع الأحادي (monorepo) هو نهج لإدارة الكود يتم فيه تخزين عدة مشاريع أو مكونات في مستودع واحد. في نظام Rust البيئي، تحظى هذه الممارسة بشعبية خاصة بفضل الدعم المدمج لـ Cargo Workspace. في هذه المقالة، سنشرح كيفية تنظيم مستودع أحادي مع Rust عمليًا: من إنشاء الهيكل إلى إدارة التبعيات والاختبار. ستتعلم كيفية تجنب الأخطاء الشائعة وجعل قاعدة الكود الخاصة بك قابلة للتوسع.



ما هو Cargo Workspace ولماذا هو مطلوب

Cargo Workspace هي آلية تسمح بإدارة عدة كريتات (مكتبات أو ملفات قابلة للتنفيذ) ضمن مشروع واحد. بدلاً من إنشاء مستودعات منفصلة لكل مكون، يمكنك دمجها في هيكل واحد. يوفر ذلك عدة مزايا:

  • نظام بناء موحد — أمر واحد cargo build يبني جميع الكريتات.
  • تبعيات مشتركة — يتم حل التبعيات المكررة مرة واحدة، مما يقلل حجم الملف الثنائي النهائي.
  • اختبار مبسط — يمكن تشغيل اختبارات جميع الكريتات بأمر واحد.
  • تناسق الإصدارات — تستخدم جميع المكونات نفس إصدارات المكتبات.

المستودع الأحادي مفيد بشكل خاص للخدمات المصغرة، والمكتبات ذات الأغراض العامة، أو المشاريع ذات التقسيم الواضح إلى طبقات (مثل النواة، API، CLI).



إنشاء هيكل المستودع الأحادي

لنبدأ بمثال عملي. لنفترض أننا نطور نظامًا لإدارة المهام. سيكون لدينا ثلاث كريتات:

  • core — مكتبة تحتوي على منطق الأعمال.
  • cli — ملف قابل للتنفيذ لسطر الأوامر.
  • server — خادم ويب (ملف قابل للتنفيذ).

أولاً، سننشئ الدليل الجذر وملف Cargo.toml لـ workspace:

mkdir task_managercd task_manager# إنشاء Cargo.toml الجذرtouch Cargo.toml

في Cargo.toml الجذر، نحدد workspace:

[workspace]members = [    "core",    "cli",    "server",]

الآن سننشئ كل كريت باستخدام cargo new:

cargo new core --libcargo new clicargo new server

بعد ذلك، سيبدو الهيكل كالتالي:

task_manager/├── Cargo.toml          # Workspace الجذر├── core/│   ├── Cargo.toml│   └── src/│       └── lib.rs├── cli/│   ├── Cargo.toml│   └── src/│       └── main.rs└── server/    ├── Cargo.toml    └── src/        └── main.rs

لاحظ: Cargo.toml الجذر لا يحتوي على قسم [package]، فقط [workspace]. هذا مهم للتشغيل الصحيح.



إدارة التبعيات بين الكريتات

إحدى المهام الرئيسية في المستودع الأحادي هي تكوين التبعيات بين الكريتات بشكل صحيح. في مثالنا، تعتمد cli و server على core. سنحدد ذلك في ملفات Cargo.toml الخاصة بهما:

لـ cli/Cargo.toml:

[package]name = "cli"version = "0.1.0"edition = "2021"

[dependencies]core = { path = "../core" }clap = { version = "4.0", features = ["derive"] } # تبعية خارجية لـ CLI

لـ server/Cargo.toml:

[package]name = "server"version = "0.1.0"edition = "2021"

[dependencies]core = { path = "../core" }actix-web = "4" # تبعية خارجية لخادم الويب

في Cargo.toml الجذر، يمكن أيضًا تحديد التبعيات المشتركة إذا كانت مطلوبة من قبل جميع الكريتات، ولكن عادةً ما يتم ذلك بشكل فردي. ومع ذلك، يسمح workspace بحل تعارضات الإصدارات: إذا استخدمت كريتتان نفس المكتبة، فسيقوم Cargo تلقائيًا بسحب إصدار واحد

المدونات

توصيات الكتب