البرمجة

مساحات عمل كارجو في رست

مساحة العمل Cargo Workspaces في لغة رست Rust وتحميل الحزم من crates.io

تُعدّ لغة رست (Rust) من اللغات الحديثة التي تجمع بين الأداء العالي والأمان في التعامل مع الذاكرة، مما يجعلها خيارًا مثاليًا لتطوير البرمجيات التي تتطلب كفاءة قوية وقابلية للصيانة على المدى الطويل. إحدى الميزات التي تجعل من لغة رست بيئة إنتاجية للغاية هي نظام إدارة الحزم والمشاريع الخاص بها والمعروف باسم Cargo. في هذا المقال، سنقدم شرحًا تفصيليًا وشاملًا حول مساحة العمل Cargo Workspaces، وماهيتها، وفوائدها، وكيفية إعدادها واستعمالها بفعالية في المشاريع البرمجية، بالإضافة إلى شرح كيفية تحميل الحزم من منصة crates.io التي تُعتبر المستودع الرسمي لحزم رست.


مفهوم Cargo Workspaces

ما هي مساحة العمل في كارجو؟

مساحة العمل (Workspace) في كارجو هي طريقة لتنظيم مشاريع متعددة (crates) ضمن مجلد واحد مشترك بحيث تتمكن من مشاركتها في سياق مشروع واحد متكامل. وتتيح هذه الميزة إدارة الإصدارات، بناء المشاريع، اختبارها، وتشغيلها بطريقة مركزية موحدة.

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


فوائد استخدام Cargo Workspaces

1. تنظيم المشاريع بشكل أفضل

عند تطوير نظام برمجي كبير، يصبح من الضروري تفكيك المشروع إلى وحدات مستقلة. باستخدام Cargo Workspaces، يمكن جمع هذه الوحدات في مساحة عمل واحدة مما يسهل إدارة الكود على نطاق واسع.

2. مشاركة تبعيات البناء

الحزم داخل مساحة العمل يمكن أن تشارك نفس مجلد target. هذا يوفر وقتًا وجهدًا أثناء عملية البناء لأن التبعيات (dependencies) المشتركة لا يتم إعادة بناؤها لكل حزمة بشكل منفصل.

3. بناء واختبار موحّد

يمكنك استخدام أوامر cargo build و cargo test لبناء أو اختبار جميع الحزم الموجودة في مساحة العمل دفعة واحدة، مما يسهل ضمان تكامل النظام ككل.

4. تسهيل التكامل المستمر CI/CD

في البيئات التي تستخدم التكامل المستمر، تسهل Cargo Workspaces إعداد خطوط البناء والاختبار بطريقة أوتوماتيكية وشاملة لجميع مكونات المشروع.


إنشاء مساحة عمل Cargo Workspaces

لإنشاء مساحة عمل جديدة، يجب إعداد بنية المجلدات وكتابة ملف تكوين Cargo.toml خاص بمجلد الجذر ليعرف الحزم الفرعية الموجودة في المساحة. النموذج التالي يوضح كيفية البدء:

بنية المجلدات:

my_workspace/ │ ├── Cargo.toml ├── package_a/ │ └── Cargo.toml └── package_b/ └── Cargo.toml

محتوى ملف Cargo.toml في مجلد الجذر:

toml
[workspace] members = [ "package_a", "package_b" ]

خطوات التنفيذ:

  1. أنشئ مجلد الجذر للمشروع:

    mkdir my_workspace && cd my_workspace

  2. أنشئ الحزم الفرعية:

    cargo new package_a

    cargo new package_b

  3. حرر ملف Cargo.toml الجذري لإضافة الحزم إلى [workspace].


العمل داخل مساحة العمل

بعد إعداد المساحة، يمكن تنفيذ أوامر cargo من الجذر لتطبيقها على جميع الحزم. بعض الأوامر الشائعة تشمل:

  • cargo build لبناء جميع الحزم.

  • cargo test لاختبار جميع الحزم.

  • cargo run -p package_a لتشغيل حزمة معينة داخل مساحة العمل.


ربط الحزم داخل نفس مساحة العمل

يمكن للحزم داخل نفس مساحة العمل أن تستخدم بعضها البعض كاعتماد داخلي دون الحاجة إلى نشرها على crates.io. يكفي استخدام المسار المحلي على النحو التالي:

مثال من package_b/Cargo.toml لاستخدام package_a:

toml
[dependencies] package_a = { path = "../package_a" }

تحميل الحزم من crates.io

ما هو crates.io؟

crates.io هو المستودع الرسمي لحزم لغة رست، ويحتوي على آلاف الحزم (crates) المفتوحة المصدر التي يمكن استخدامها في المشاريع لتوسيع وظائف البرنامج بسهولة.

كيفية استخدامه

لاستخدام حزمة من crates.io، يكفي إضافتها إلى قسم [dependencies] في ملف Cargo.toml الخاص بالحزمة المستهدفة.

مثال على استخدام حزمة serde:

toml
[dependencies] serde = { version = "1.0", features = ["derive"] }

ثم يمكن استخدامها في الكود على النحو التالي:

rust
use serde::{Serialize, Deserialize}; #[derive(Serialize, Deserialize)] struct Person { name: String, age: u8, }

إدارة التبعيات في مساحة العمل

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

ملاحظة مهمة:

لا يمكن تعريف تبعيات مشتركة لجميع الحزم داخل ملف Cargo.toml الجذري لمساحة العمل مباشرةً، بل يجب إدراجها في كل حزمة فرعية حسب الحاجة.


التعامل مع الإصدارات

عند استخدام مساحة عمل لنشر الحزم إلى crates.io، يمكن التحكم في رقم الإصدار لكل حزمة على حدة. من الأفضل مزامنة الأرقام يدويًا أو باستخدام أدوات إدارة الإصدارات مثل cargo-release.


استخدام الجداول لتوضيح الفروقات بين المشاريع العادية ومساحات العمل

الخاصية مشروع Rust عادي Cargo Workspace
عدد الحزم حزمة واحدة فقط عدة حزم داخل نفس الجذر
ملف Cargo.toml واحد فقط ملف واحد للجذر + لكل حزمة فرعية
مشاركة التبعيات لا نعم، عبر مجلد target المشترك
إدارة البناء والاختبار لكل حزمة على حدة مركزي لكل الحزم
التكامل مع CI معقد مبسط وموحد
ربط الحزم داخليًا عبر crates.io أو المسارات مباشرة عبر path

حالات استخدام عملية لمساحات العمل

  1. تطوير مكتبة مع أدوات تنفيذية: يمكن إنشاء مكتبة core_lib تضم منطق البرنامج الأساسي، وإنشاء حزم تنفيذية مثل cli_tool و gui_app داخل نفس المساحة.

  2. تقسيم مشروع كبير إلى وحدات: عندما يصبح المشروع كبيرًا جدًا، يُستحسن فصله إلى وحدات مثل networking, database, api, frontend, مما يحسن التنظيم وسهولة الاختبار.

  3. دعم التعدد المعماري: في المشاريع التي تستهدف منصات مختلفة، يمكن إنشاء حزم مخصصة لكل منصة ضمن نفس مساحة العمل.


أدوات مساعدة لإدارة Workspaces

بالإضافة إلى cargo الأساسي، توجد بعض الأدوات المفيدة التي تسهل العمل في مساحات العمل الكبيرة:

  • cargo-make: أداة لتنفيذ مهام مخصصة آليًا عبر ملفات make مشابهة لـ makefile.

  • cargo-release: إدارة تلقائية للإصدارات في مساحة العمل.

  • cargo-edit: لتحديث التبعيات من سطر الأوامر.


إدارة الحزم الداخلية والخارجية

يمكن للحزم داخل مساحة العمل أن تعتمد على حزم خارجية من crates.io وحزم داخلية عبر path. هذا يوفر مرونة عالية عند تطوير منتجات مركّبة تحتاج إلى جمع مكتبات عامة وخاصة في نفس السياق البرمجي.


تكامل Cargo Workspaces مع Git

عند استخدام Git في مشروع يحتوي على مساحة عمل، يمكن إعداد ملفات .gitignore على مستوى الجذر لتجاهل مجلد target المشترك. كما يمكن إعداد الفروع والعمل الجماعي بمرونة حيث يتم تجزئة كل مكون في مجلد مستقل، مع تسهيل الدمج والمراجعة.


الخلاصة التقنية

تُعد ميزة Cargo Workspaces من أهم الأدوات التي توفرها لغة رست للمطورين، إذ تتيح تنظيم المشاريع بكفاءة عالية، وتوفير الجهد في إدارة التبعيات والبناء، فضلًا عن تسهيل التكامل مع بيئات التطوير والتشغيل الحديثة. وعند دمج هذه الميزة مع إمكانيات تحميل الحزم من crates.io، تصبح بيئة تطوير رست أكثر قوة وقابلية للتوسع، وهو ما يجعلها مناسبة للمشاريع الكبيرة والمعقدة، سواء كانت مكتبات، أدوات تنفيذية، أو تطبيقات متكاملة.


المصادر