توثيق في Rust: تقنيات وأدوات متقدمة

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

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

ابدأ الدورة

مقدمة: لماذا التوثيق في Rust هو أكثر من مجرد تعليقات

\n\n

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

\n\n

في هذه المقالة، سنستعرض الأدوات والتقنيات التي ستساعدك في إنشاء توثيق بمستوى enterprise: من الاختبار التلقائي للأمثلة إلى إنشاء الكتب والتكامل مع CI/CD.

\n\n

1. Doctests: توثيق لا يكذب

\n\n

الميزة الرئيسية لـ rustdoc هي إمكانية تضمين أمثلة كود قابلة للتنفيذ مباشرة في التعليقات. يتم تجميع هذه الأمثلة وتشغيلها تلقائيًا عند تشغيل cargo test. وهذا يضمن أن توثيقك محدث دائمًا.

\n\n

doctest أساسي

\n
/// تُرجع مجموع رقمين.\n///\n/// # مثال\n///\n/// ```\n/// let result = my_crate::add(2, 3);\n/// assert_eq!(result, 5);\n/// ```\npub fn add(a: i32, b: i32) -> i32 {\n    a + b\n}
\n\n

تقنيات متقدمة مع doctest

\n

يمكنك إخفاء أسطر الإعداد التي لا ينبغي عرضها في التوثيق باستخدام # :

\n
/// # مثال مع التهيئة\n///\n/// ```\n/// # use std::collections::HashMap;\n/// let mut map = HashMap::new();\n/// map.insert("key", 42);\n/// assert_eq!(map.get("key"), Some(&42));\n/// ```
\n\n

يمكنك أيضًا التحقق من أن الكود لا يتم تجميعه (على سبيل المثال، عرض أخطاء وقت التجميع):

\n
/// ```compile_fail\n/// let x: i32 = "سلسلة"; // خطأ: عدم تطابق الأنواع\n/// ```
\n\n

2. سمات التوثيق: التحكم والبيانات الوصفية

\n\n

تتيح السمات #[doc(...)] ضبط عرض التوثيق بدقة.

\n\n

إخفاء العناصر

\n
/// دالة داخلية، غير مخصصة للاستخدام العام.\n#[doc(hidden)]\npub fn internal_helper() {}
\n\n

التصنيف والبحث

\n
/// مجموعة أدوات للعمل مع الشبكة.\n#[doc(alias = "net")]\n#[doc(alias = "socket")]\npub mod network {\n    // ...\n}
\n\n

تضمين التوثيق من مكان آخر

\n
/// راجع [توثيق الوحدة](index.html) للحصول على معلومات عامة.\n#[doc(include = "docs/faq.md")]\npub fn complex_function() {}
\n\n

3. Cross-references والتنقل

\n\n

يدعم Rustdoc الروابط إلى عناصر التوثيق الأخرى. وهذا يخلق هيكلًا متماسكًا وسهل القراءة.

\n\n

روابط إلى الدوال والأنواع

\n
/// استخدم [`Config::new`] لإنشاء مثيل.\n///\n/// للإعدادات الأكثر تعقيدًا، راجع الوحدة [`config`].\npub struct Config { /* ... */ }
\n\n

روابط إلى الحزم الخارجية

\n
/// تستخدم هذه الدالة [serde_json] للتسلسل.\n///\n/// [serde_json]: https://docs.rs/serde_json\npub fn to_json() {}
\n\n

4. أدوات للمشاريع الكبيرة: mdBook وتوثيق الحزمة

\n\n

عندما يصبح cargo doc وحده غير كافٍ، يأتي mdBook للإنقاذ - وهي أداة لإنشاء الكتب من ملفات Markdown. وهي مثالية لكتابة الأدلة والدروس والتوثيق المعماري.

\n\n

بداية سريعة مع mdBook

\n
# التثبيت\ncargo install mdbook\n\n# إنشاء مشروع\nmdbook init my-book\ncd my-book\nmdbook serve --open
\n\n

التكامل مع rustdoc

\n

يمكنك تضمين التوثيق من mdBook في cargo doc باستخدام السمة #[doc = include_str!()]:

\n
/// # البنية\n///\n/// وصف تفصيلي لبنية المكتبة:\n///\n#[doc = include_str!("../docs/architecture.md")]\npub mod core {\n    // ...\n}
\n\n

الخاتمة

المدونات

توصيات الكتب