كيفية ربط كريت Rust محلي (crate) قبل النشر: دليل خطوة بخطوة

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

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

ابدأ الدورة

مقدمة: لماذا الكريت المحلي ليس رفاهية بل ضرورة

\n\n

تخيل: أنت تكتب مكتبة بلغة Rust لتحليل ملفات التكوين. لا تزال غير ناضجة، وغير جاهزة للنشر على crates.io، ولكنك تريد بالفعل اختبارها في مشروع حقيقي - خادم ويب على Actix أو أداة CLI. ماذا تفعل؟ نسخ الكود؟ إنشاء مستودع واحد؟ لا، في Rust يوجد حل أنيق - كريت محلي غير منشور.

\n\n

سؤال "How to use a local unpublished crate?" حصد آلاف المشاهدات على Stack Overflow. هذا ليس صدفة: كل مطور Rust يواجه عاجلاً أم آجلاً الحاجة لربط كريته الخاص الذي لم يُنشر بعد. في هذه المقالة سنستعرض جميع الطرق - من تحديد المسار البسيط إلى العمل مع تبعيات Git ومساحات العمل. هيا بنا!

\n\n

ما هو الكريت غير المنشور ولماذا هو مطلوب؟

\n\n

Unpublished crate (كريت غير منشور) هو حزمة Rust موجودة فقط على قرصك المحلي أو في مستودع خاص. لم يتم تحميلها على crates.io وغير متاحة للمطورين الآخرين (إلا إذا منحتهم حق الوصول إلى الملفات).

\n\n

سيناريوهات الاستخدام النموذجية:

\n
    \n
  • تطوير مكتبة بالتوازي مع المشروع الرئيسي
  • \n
  • إعادة الهيكلة: تقوم بفصل جزء من الكود إلى كريت منفصل
  • \n
  • مكتبات مؤسسية خاصة لا يمكن نشرها
  • \n
  • اختبار التبعيات قبل النشر
  • \n
\n\n

الميزة الرئيسية - تحصل على تحكم كامل في الكود ويمكنك إجراء تغييرات فورية دون انتظار النشر على crates.io.

\n\n

الطريقة 1: تبعية المسار - الأبسط والأسرع

\n\n

هذه هي الطريقة الأساسية، وهي مناسبة عندما يكون كلا المشروعين (التابع والمُتبَع) موجودين على جهاز الكمبيوتر الخاص بك.

\n\n

هيكل المشروع

\n\n

لنفترض أن لديك هيكل المجلدات التالي:

\n\n
my_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:

\n\n
[package]\nname = "my_lib"\nversion = "0.1.0"\nedition = "2021"\n\n[dependencies]
\n\n

في my_lib/src/lib.rs سنكتب دالة بسيطة:

\n\n
pub fn greet(name: &str) -> String {\n    format!("مرحباً، {}! هذا كريت محلي.", name)\n}
\n\n

الخطوة 2: ربط my_lib في my_app عبر المسار

\n\n

في my_app/Cargo.toml نضيف قسم [dependencies]:

\n\n
[package]\nname = "my_app"\nversion = "0.1.0"\nedition = "2021"\n\n[dependencies]\nmy_lib = { path = "../my_lib" }
\n\n

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

\n\n

الخطوة 3: استخدام الكريت في الكود

\n\n

في my_app/src/main.rs:

\n\n
use my_lib::greet;\n\nfn main() {\n    let message = greet("أليكسي");\n    println!("{}", message);\n}
\n\n

نشغل: cargo run - ونرى الإخراج: "مرحباً، أليكسي! هذا كريت محلي."

\n\n

مهم! أي تغييرات في my_lib سيتم التقاطها تلقائياً في البناء التالي لـ my_app. لا حاجة لإعادة تثبيت أي شيء أو تحديث الإصدارات.

\n\n

الطريقة 2: تبعيات Git - للعمل الجماعي

\n\n

إذا كنت تعمل ضمن فريق أو تخزن الكود في Git، فمن الأفضل استخدام تبعيات Git. هذا مناسب عندما يكون الكريت في مستودع منفصل (حتى لو كان خاصاً).

\n\n

الإعداد

\n\n

لنفترض أن كريتك غير المنشور my_lib موجود في المستودع https://github.com/yourname/my_lib.git

المدونات

توصيات الكتب