تكوين تطبيقات Rust: مكتبات config و envy و dotenvy
عند تطوير التطبيقات بلغة Rust، تعد إدارة التكوين إحدى المهام الرئيسية. تعتمد مرونة التطبيق وأمانه وسهولة نشره على النهج الصحيح لتحميل الإعدادات. في نظام Rust البيئي، توجد عدة حلول ناضجة تسمح بقراءة التكوين من الملفات ومتغيرات البيئة والمصادر الأخرى. في هذه المقالة، سنستعرض ثلاث أدوات شائعة: config و envy و dotenvy.
1. مكتبة config - مدير تكوين شامل
config هي مكتبة قوية لتحميل التكوينات الهرمية. تدعم عدة صيغ (JSON، TOML، YAML، HJSON، INI)، بالإضافة إلى متغيرات البيئة والمصادر البعيدة. الفكرة الأساسية هي دمج جميع المصادر في شجرة إعدادات واحدة.
التثبيت
[dependencies]config = "0.14"serde = { version = "1.0", features = ["derive"] }مثال على الاستخدام
use config::{Config, File, Environment};use serde::Deserialize;
#[derive(Debug, Deserialize)]struct AppConfig { server: ServerConfig, database: DatabaseConfig,}
#[derive(Debug, Deserialize)]struct ServerConfig { host: String, port: u16,}
#[derive(Debug, Deserialize)]struct DatabaseConfig { url: String, pool_size: u32,}
fn load_config() -> Result<AppConfig, config::ConfigError> { let cfg = Config::builder() .add_source(File::with_name("config/default")) // الإعدادات الأساسية .add_source(File::with_name("config/local").required(false)) // التجاوزات المحلية .add_source(Environment::with_prefix("APP")) // متغيرات البيئة ببادئة APP_ .build()?;
cfg.try_deserialize()}
fn main() { match load_config() { Ok(config) => println!("Loaded config: {:?}", config), Err(e) => eprintln!("Config error: {}", e), }}تقوم المكتبة تلقائياً بدمج المصادر: القيم من المصادر اللاحقة تستبدل القيم السابقة. هذا يسمح بتنظيم هرمي بسهولة: الافتراضي → البيئة → التجاوز المحلي.
2. مكتبة envy - تكوين من متغيرات البيئة
envy هي مكتبة بسيطة تقوم بتحميل التكوين حصرياً من متغيرات البيئة. مثالية لتطبيقات 12-factor حيث يجب فصل الإعدادات عن الكود.
التثبيت
[dependencies]envy = "0.4"serde = { version = "1.0", features = ["derive"] }مثال على الاستخدام
use serde::Deserialize;
#[derive(Debug, Deserialize)]struct AppConfig { #[serde(rename = "SERVER_HOST")] host: String, #[serde(rename = "SERVER_PORT")] port: u16, #[serde(rename = "DATABASE_URL")] db_url: String,}
fn load_config() -> Result<AppConfig, envy::Error> { envy::from_env::<AppConfig>()}
fn main() { match load_config() { Ok(config) => println!("Env config: {:?}", config), Err(e) => eprintln!("Envy error: {}", e), }}للعمل، يكفي تعيين متغيرات البيئة:
export SERVER_HOST=127.0.0.1export SERVER_PORT=8080export DATABASE_URL=postgres://user:pass@localhost/dbتدعم envy الهياكل المتداخلة عبر الفواصل (مثل DATABASE__HOST)، بالإضافة إلى الحقول الاختيارية ذات القيمة الافتراضية.
3. مكتبة dotenvy - تحميل ملفات .env
dotenvy هي شوكة من المكتبة الشهيرة dotenv، مصممة لتحميل متغيرات البيئة من ملفات .env. مفيدة بشكل خاص أثناء التطوير عندما تحتاج إلى تعيين إعدادات محلية بسرعة.
التثبيت
[dependencies]dotenvy = "0.15"<