إذا كنت تعمل مع Docker أو Kubernetes أو GitHub Actions أو أي أداة DevOps حديثة تقريبًا، فأنت تستخدم YAML بالفعل سواء أدركت ذلك أم لا. YAML (التي تعني "YAML Ain't Markup Language" — نعم، إنه اختصار تكراري) صُممت لتكون أكثر تنسيقات البيانات قابلية للقراءة من قبل البشر.

دعنا نتعلمها معًا، مفهومًا تلو الآخر.

لماذا يوجد YAML

JSON رائع للآلات، لكن هل حاولت يومًا كتابة ملف تكوين من 200 سطر بصيغة JSON؟ بدون تعليقات، علامات اقتباس مزدوجة إلزامية في كل مكان، خمسة مستويات من الأقواس المتداخلة... يصبح الأمر مؤلمًا بسرعة. YAML أُنشئ لحل هذه المشكلة. يستخدم المسافات البادئة بدلاً من الأقواس، مما يجعل ملفات التكوين نظيفة وسهلة القراءة.

إليك نفس البيانات بصيغة JSON وYAML. هل ترى الفرق؟

JSON:

json

YAML:

yaml

الأساسيات التي تحتاج معرفتها

أزواج المفتاح والقيمة هي الأساس في YAML. فقط استخدم نقطتين ومسافة: name: John Doe. هذا كل شيء — لا حاجة لعلامات اقتباس لمعظم النصوص.

المسافات البادئة هي كل شيء. يستخدم YAML المسافات (أبدًا علامات التبويب!) لإظهار البنية. المعيار هو مسافتان لكل مستوى. أخطئ في هذا وسيتعطل ملفك. بجدية — مواصفات YAML صارمة في هذا الشأن.

إليك مثالاً على البيانات المتداخلة:

yaml

القوائم تستخدم شرطة ومسافة. إليك قائمة مشتريات بصيغة YAML:

yaml

النصوص: أكثر تعقيدًا مما تظن

معظم النصوص لا تحتاج علامات اقتباس في YAML. لكن يجب استخدامها عندما تحتوي على نقطتين أو علامات هاش أو يمكن أن تُفسر خطأً. مثلاً، country: NO يُفسر كـ country: false في YAML 1.1 لأن NO يُعامل كقيمة منطقية. هذه هي "مشكلة النرويج" الشهيرة وقد تسببت في أخطاء حقيقية في بيئات الإنتاج.

عند الشك، ضعها بين علامات اقتباس: country: "NO"

النصوص متعددة الأسطر مذهلة

هنا يتألق YAML حقًا. علامة الأنبوب | تحافظ على الأسطر الجديدة (رائعة للسكربتات)، بينما > تطويها إلى مسافات (رائعة للأوصاف الطويلة):

yaml
yaml

المراسي والأسماء المستعارة: ملفات تكوين DRY

واحدة من أروع ميزات YAML. عرّف شيئًا مرة واحدة باستخدام &، وأشر إليه لاحقًا باستخدام *:

yaml

كتلة production ترث retries: 3 من الإعدادات الافتراضية لكنها تتجاوز timeout. هذا مفيد للغاية في سير عمل GitHub Actions وملفات Docker Compose حيث ستضطر لتكرار نفس كتل التكوين مرارًا وتكرارًا.

أكثر 4 أخطاء شائعة في YAML

  • علامات تبويب بدل المسافات — قد يُدرج محررك علامات تبويب افتراضيًا. اضبطه لاستخدام المسافات في ملفات YAML. بجدية، افعل هذا الآن.
  • فخاخ القيم المنطقيةyes، no، on، off، true، false كلها قيم منطقية في YAML 1.1. استخدم علامات الاقتباس إذا كنت تقصد النص.
  • نقطتان في القيمmessage: Error: file not found ستتعطل لأن YAML يرى فاصل مفتاح-قيمة ثانٍ. استخدم علامات الاقتباس: message: "Error: file not found"
  • المسافات الزائدة في النهاية — المسافات غير المرئية في نهاية الأسطر يمكن أن تسبب سلوك تحليل غريب. استخدم محررًا يُبرز المسافات الزائدة.

أين ستستخدم YAML كل يوم

YAML هي لغة التكوين لـ Docker Compose ومانيفستات Kubernetes وGitHub Actions وGitLab CI وأدلة تشغيل Ansible وعشرات غيرها. إذا كنت تعمل في أي شيء في DevOps أو السحابة، فإتقان YAML أمر لا مفر منه.

لديك ملف YAML يتصرف بشكل غريب؟ الصقه في أداة YAML Validator الخاصة بنا لاكتشاف المشكلة فورًا.

YAML في العالم الحقيقي: مثال Docker Compose

لنلقِ نظرة على ملف Docker Compose واقعي — من النوع الذي ستكتبه فعلاً لتطبيق ويب:

yaml

لاحظ بعض الأشياء: يمكن كتابة متغيرات البيئة كقائمة (- KEY=value) أو كتعيين (KEY: value). كلاهما يعمل في Docker Compose — لكن اختر أسلوبًا واحدًا والتزم به للحفاظ على التناسق.

YAML في العالم الحقيقي: أنبوب CI في GitHub Actions

إليك سير عمل GitHub Actions يُشغّل الاختبارات مع كل عملية دفع:

yaml

هذا نظيف وقابل للقراءة وواضح بذاته. تخيل كتابة نفس سير العمل بصيغة JSON — سيكون ضعف الطول وأصعب بكثير في القراءة بصريًا.

YAML مقابل JSON مقابل TOML: مقارنة سريعة

YAML ليس البديل الوحيد لـ JSON في ملفات التكوين. TOML خيار شائع آخر (يُستخدم في Cargo.toml لـ Rust وpyproject.toml لـ Python). إليك كيف يُقارنون:

الميزةYAMLJSONTOML
التعليقاتنعم (#)لانعم (#)
قابلية القراءةممتازةجيدةجيدة جدًا
البنى المتداخلةمسافات بادئةأقواسأقسام/نقاط
نصوص متعددة الأسطرنعم (`، >`)لانعم (""")
استنتاج الأنواعنعم (قد يكون خطيرًا)صريحنعم (أكثر أمانًا)
الفواصل الزائدةغ/مغير مسموحمسموح
النظام البيئيDevOps، K8s، CI/CDWeb APIs، Node.jsRust، Python

YAML متقدم: مستندات متعددة في ملف واحد

يدعم YAML مستندات متعددة في ملف واحد، مفصولة بـ ---. يُستخدم هذا بشكل شائع في Kubernetes لنشر موارد متعددة دفعة واحدة:

yaml

الفاصل --- يخبر محلل YAML "هذا مستند جديد". يمكنك تنفيذ kubectl apply -f على ملف كهذا وسيُنشئ Kubernetes كلا الموردين.

أمان YAML: هجوم Billion Laughs

إليك شيئًا لا يعرفه معظم المبتدئين: YAML يمكن أن يكون خطرًا أمنيًا إذا لم تكن حذرًا. هجوم "Billion Laughs" يستخدم المراسي والأسماء المستعارة لإنشاء توسع بيانات أسي:

yaml

هذا الملف الصغير يمكن أن يتوسع إلى غيغابايتات في الذاكرة ويُعطل تطبيقك. الدرس؟ لا تقم أبدًا بتحليل مدخلات YAML غير موثوقة. استخدم دوال تحميل آمنة مثل yaml.safe_load() في Python بدلاً من yaml.load()، وحدد حدود الذاكرة على محلل YAML الخاص بك.

التحويل بين YAML وJSON

بما أن YAML هو مجموعة فائقة من JSON (نعم، JSON الصالح هو أيضًا YAML صالح!)، فإن التحويل بينهما بسيط. هذا مفيد عندما تريد استخدام قابلية قراءة YAML لكتابة التكوينات لكنك تحتاج JSON لواجهة برمجة تطبيقات أو أداة تتطلبه.

أداة تحويل YAML إلى JSON الخاصة بنا تتعامل مع هذا فورًا — فقط الصق YAML الخاص بك واحصل على مخرجات JSON نظيفة. في الاتجاه المعاكس؟ أي JSON لديك هو بالفعل YAML صالح.

جرّبه بنفسك

سواء كنت تُصلح مانيفست Kubernetes معطل أو تُعدّ أنبوب CI جديد، هذه الأدوات ستوفر لك الوقت:

  • YAML Formatter — أصلح المسافات البادئة واجعل ملفات YAML نظيفة ومتسقة.
  • YAML Validator — اكتشف أخطاء الصياغة قبل أن تُعطل عملية النشر.
  • محول YAML إلى JSON — حوّل بين التنسيقات عندما تحتاج للتعامل مع أدوات تقبل JSON فقط.

YAML له خصوصياته، لكن بمجرد أن تعتاد على الصياغة المعتمدة على المسافات البادئة، ستُقدّر كم تبدو ملفات التكوين أنظف مقارنة ببديل JSON.