yaml-cpp في C++: دليل شامل مع أمثلة تطبيقية
1. ما هي yaml-cpp ولماذا تحتاجها؟
yaml-cpp هي مكتبة حديثة وخفيفة الوزن بلغة C++ لتحليل (Parsing) وإنشاء ملفات YAML. YAML (YAML Ain't Markup Language) هو تنسيق لتسلسل البيانات سهل القراءة للبشر، ويُستخدم بكثرة في ملفات الإعدادات (Configuration Files)، وصف هياكل البيانات، خطوط أنابيب CI/CD (مثل GitHub Actions و GitLab CI)، وتبادل البيانات بين الخدمات. على عكس JSON، يدعم YAML التعليقات، النصوص متعددة الأسطر، والمراجع (Anchors and Aliases)، مما يجعله مثالياً للإعدادات.
لماذا تستخدم yaml-cpp؟ إذا كنت تكتب تطبيقاً بلغة C++ يحتاج إلى قراءة ملفات إعدادات (مثل إعدادات الخادم، معلمات نموذج تعلم آلي، أو وصف التبعيات)، فإن yaml-cpp توفر واجهة برمجية بسيطة وآمنة من ناحية الأنواع. المكتبة متوافقة تماماً مع مواصفات YAML 1.2، وتدعم جميع أنواع البيانات (القيم المفردة، المصفوفات، القواميس)، وتسمح بتحويل مستندات YAML بسهولة إلى هياكل C++ والعكس.
المزايا الرئيسية: اعتماديات قليلة (فقط مكتبة C++ القياسية C++11/14/17)، إمكانية البناء كـ header-only، دعم Unicode، إمكانية التسلسل المخصص للأنواع المخصصة، ومجتمع نشط (أكثر من 5 آلاف نجمة على GitHub).
2. التثبيت
لا يتم تثبيت yaml-cpp عبر مديري حزم اللغات (مثل pip أو npm). بالنسبة لـ C++، تُستخدم مديري الحزم النظامية أو البناء من المصدر.
لينكس (Debian/Ubuntu)
sudo apt-get install libyaml-cpp-dev
ماك (Homebrew)
brew install yaml-cpp
ويندوز (vcpkg)
vcpkg install yaml-cpp
البناء من المصدر (CMake)
git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp
mkdir build && cd build
cmake -DYAML_BUILD_SHARED_LIBS=ON ..
make
sudo make install
بعد التثبيت، قم بربط المكتبة في ملف CMakeLists.txt:
find_package(yaml-cpp REQUIRED)
target_link_libraries(my_project yaml-cpp)
3. البداية السريعة — مثال عملي مصغر
أنشئ ملفاً باسم config.yaml:
server:
host: "localhost"
port: 8080
debug: true
لنقرأه باستخدام yaml-cpp:
#include <iostream>
#include <yaml-cpp/yaml.h>
int main() {
// تحميل ملف YAML
YAML::Node config = YAML::LoadFile("config.yaml");
// قراءة القيم
std::string host = config["server"]["host"].as<std::string>();
int port = config["server"]["port"].as<int>();
bool debug = config["debug"].as<bool>();
std::cout << "Host: " << host << "\n";
std::cout << "Port: " << port << "\n";
std::cout << "Debug: " << std::boolalpha << debug << "\n";
return 0;
}
الترجمة: g++ -std=c++17 main.cpp -lyaml-cpp -o app
4. أهم الدوال/الفئات الأساسية
4.1. YAML::Node — الفئة الرئيسية للتعامل مع العُقد
التوقيع: class YAML::Node
الوصف: تمثل أي عنصر في مستند YAML: قيمة مفردة (Scalar)، مصفوفة (Sequence)، أو قاموس (Map). تدعم التكرار، الوصول بالمفتاح/الفهرس، والتحقق من النوع.
YAML::Node node;
node["name"] = "Alice";
node["age"] = 30;
node["hobbies"].push_back("reading");
node["hobbies"].push_back("coding");
std::cout << node["name"].as<std::string>() << "\n"; // Alice
std::cout << node["hobbies"][0].as<std::string>() << "\n"; // reading
4.2. YAML::LoadFile() — التحميل من ملف
التوقيع: