config في Rust: دليل شامل مع أمثلة عملية

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

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

ابدأ الدورة

مكتبة config في Rust: دليل شامل لإدارة الإعدادات

1. ما هي مكتبة config ولماذا تحتاجها؟

مكتبة config (crate config في نظام Rust البيئي) هي أداة قوية ومرنة لإدارة إعدادات التطبيقات. توفر واجهة موحدة لتحميل الإعدادات من مصادر متعددة: ملفات (JSON, YAML, TOML, INI, HJSON)، متغيرات البيئة، وسائط سطر الأوامر، وحتى المصادر البعيدة. المهمة الأساسية للمكتبة هي تجريد عملية قراءة ودمج الإعدادات، مما يسمح للمطور بالتركيز على منطق الأعمال بدلاً من تحليل الصيغ المختلفة.

لماذا تحتاجها في المشاريع الحقيقية؟ التطبيقات الحديثة نادراً ما تعتمد على مصدر واحد للإعدادات. السيناريو النموذجي: الإعدادات الأساسية تُخزّن في ملف config.toml، البيانات الحساسة (كلمات المرور، مفاتيح API) تُسحب من متغيرات البيئة، والمعاملات الخاصة بتشغيل معين تُمرّر عبر وسائط سطر الأوامر. تتيح لك config دمج كل هذه المصادر في شجرة إعدادات واحدة مع أولوية واضحة (مثلاً، متغيرات البيئة تتجاوز قيم الملفات). بدون هذه المكتبة، سيضطر المطور لكتابة كود يدوي لكل مصدر، ومعالجة أخطاء التحليل، ومراقبة ترتيب التجاوز.

المزايا الرئيسية لـ config: أمان كامل للأنواع (يتم تحويل الإعدادات إلى هياكل Rust)، دعم الإعدادات المتداخلة، تتبع تلقائي للتغييرات في الملفات (watch)، وقابلية التوسع عبر مصادر بيانات مخصصة. تُستخدم المكتبة على نطاق واسع في مشاريع الإنتاج مثل خوادم الويب، أدوات CLI، والخدمات المصغرة.

2. التثبيت

لإضافة مكتبة config إلى مشروع Rust، استخدم مدير الحزم Cargo. نفّذ في الطرفية داخل المجلد الجذر لمشروعك:

cargo add config

إذا كنت تفضل التحرير اليدوي لملف Cargo.toml، أضف إلى قسم [dependencies]:

[dependencies]
config = "0.14"

ستحتاج أيضاً إلى crate للتسلسل/إلغاء التسلسل. يُوصى باستخدام serde مع derive macro:

cargo add serde --features derive

للعمل مع صيغ ملفات محددة، أضف feature flags المناسبة. مثلاً، لدعم TOML و YAML و JSON:

cargo add config --features yaml,json,toml

قائمة الصيغ المتاحة كاملة: ini، json، toml، yaml، hjson. إذا كنت تخطط لاستخدام صيغة واحدة فقط، حددها فقط — فهذا يقلل وقت الترجمة.

3. البداية السريعة — مثال عملي بسيط

أنشئ ملف Settings.toml في المجلد الجذر للمشروع:

# Settings.toml
[server]
host = "127.0.0.1"
port = 8080

[database]
url = "postgres://user:pass@localhost/db"
pool_size = 10

الآن اكتب الكود لقراءة هذه الإعدادات:

use config::{Config, File, FileFormat};
use serde::Deserialize;
use std::env;

#[derive(Debug, Deserialize)]
struct ServerConfig {
    host: String,
    port: u16,
}

#[derive(Debug, Deserialize)]
struct DatabaseConfig {
    url: String,
    pool_size: u32,
}

#[derive(Debug, Deserialize)]
struct AppConfig {
    server: ServerConfig,
    database: DatabaseConfig,
}

fn main() -> Result<(), config::ConfigError> {
    // إنشاء builder للإعدادات
    let builder = Config::builder()
        // إضافة الملف كمصدر
        .add_source                    

توصيات