مقدمة: لماذا الكريت المحلي ليس رفاهية بل ضرورة
\n\nتخيل: أنت تكتب مكتبة بلغة Rust لتحليل ملفات التكوين. لا تزال غير ناضجة، وغير جاهزة للنشر على crates.io، ولكنك تريد بالفعل اختبارها في مشروع حقيقي - خادم ويب على Actix أو أداة CLI. ماذا تفعل؟ نسخ الكود؟ إنشاء مستودع واحد؟ لا، في Rust يوجد حل أنيق - كريت محلي غير منشور.
سؤال "How to use a local unpublished crate?" حصد آلاف المشاهدات على Stack Overflow. هذا ليس صدفة: كل مطور Rust يواجه عاجلاً أم آجلاً الحاجة لربط كريته الخاص الذي لم يُنشر بعد. في هذه المقالة سنستعرض جميع الطرق - من تحديد المسار البسيط إلى العمل مع تبعيات Git ومساحات العمل. هيا بنا!
\n\nما هو الكريت غير المنشور ولماذا هو مطلوب؟
\n\nUnpublished crate (كريت غير منشور) هو حزمة Rust موجودة فقط على قرصك المحلي أو في مستودع خاص. لم يتم تحميلها على crates.io وغير متاحة للمطورين الآخرين (إلا إذا منحتهم حق الوصول إلى الملفات).
سيناريوهات الاستخدام النموذجية:
\n- \n
- تطوير مكتبة بالتوازي مع المشروع الرئيسي \n
- إعادة الهيكلة: تقوم بفصل جزء من الكود إلى كريت منفصل \n
- مكتبات مؤسسية خاصة لا يمكن نشرها \n
- اختبار التبعيات قبل النشر \n
الميزة الرئيسية - تحصل على تحكم كامل في الكود ويمكنك إجراء تغييرات فورية دون انتظار النشر على crates.io.
\n\nالطريقة 1: تبعية المسار - الأبسط والأسرع
\n\nهذه هي الطريقة الأساسية، وهي مناسبة عندما يكون كلا المشروعين (التابع والمُتبَع) موجودين على جهاز الكمبيوتر الخاص بك.
\n\nهيكل المشروع
\n\nلنفترض أن لديك هيكل المجلدات التالي:
\n\nmy_project/\n├── my_lib/ # unpublished crate\n│ ├── Cargo.toml\n│ └── src/\n│ └── lib.rs\n└── my_app/ # المشروع الرئيسي\n ├── Cargo.toml\n └── src/\n └── main.rs\n\nالخطوة 1: إنشاء المكتبة my_lib
\n\nداخل my_lib/Cargo.toml:
[package]\nname = "my_lib"\nversion = "0.1.0"\nedition = "2021"\n\n[dependencies]\n\nفي my_lib/src/lib.rs سنكتب دالة بسيطة:
pub fn greet(name: &str) -> String {\n format!("مرحباً، {}! هذا كريت محلي.", name)\n}\n\nالخطوة 2: ربط my_lib في my_app عبر المسار
\n\nفي my_app/Cargo.toml نضيف قسم [dependencies]:
[package]\nname = "my_app"\nversion = "0.1.0"\nedition = "2021"\n\n[dependencies]\nmy_lib = { path = "../my_lib" }\n\nملاحظة: المسار يُحدد نسبةً إلى ملف Cargo.toml للمشروع الرئيسي. إذا كانت المكتبة في مجلد آخر، حدد مساراً مطلقاً أو نسبياً.
الخطوة 3: استخدام الكريت في الكود
\n\nفي my_app/src/main.rs:
use my_lib::greet;\n\nfn main() {\n let message = greet("أليكسي");\n println!("{}", message);\n}\n\nنشغل: cargo run - ونرى الإخراج: "مرحباً، أليكسي! هذا كريت محلي."
مهم! أي تغييرات في my_lib سيتم التقاطها تلقائياً في البناء التالي لـ my_app. لا حاجة لإعادة تثبيت أي شيء أو تحديث الإصدارات.
الطريقة 2: تبعيات Git - للعمل الجماعي
\n\nإذا كنت تعمل ضمن فريق أو تخزن الكود في Git، فمن الأفضل استخدام تبعيات Git. هذا مناسب عندما يكون الكريت في مستودع منفصل (حتى لو كان خاصاً).
\n\nالإعداد
\n\nلنفترض أن كريتك غير المنشور my_lib موجود في المستودع https://github.com/yourname/my_lib.git