تومل مقابل يامل مقابل جي اس - تنسيقات التكوين المُصنفة حسب مدى إزعاجها لك

تحديث في

كل صيغة التكوين سينتهي بانهاءك. يالم مع عالم التصنيف والتحويل السكاني، جي اس آي مع سياسة عدم وجود تعليقات، تومل مع لحظة "انتظر، ماذا يعني هذا السطر؟". إليك التحليل المُحتمل لتكلفة كل منها — ومتى تختار كل واحد منها.

تومل مقابل يامل مقابل جين - تنسيقات التكوين المرتبة حسب مدى إزعاجها لك 1
إعلان · حذف؟

كل مشروع يُؤدي في النهاية إلى اختيار تنسيق إعدادات. يُستخدم YAML في كل الأماكن. كان JSON أقدم من بعض الزملاء. ظهر TOML مؤخرًا مع تأكيد "في الواقع، تم تصميمه لهذا الهدف". سيُخيبك الثلاثة في النهاية. الخيبات تختلف فقط.

إليك مقارنة مباشرة — نفس الإعداد، ثلاث تنسيقات — تليها التوقيت الدقيق الذي سيجعلك تندم على خيارات حياتك.

نفس الإعداد، ثلاث طرق

مُكوّن بسيط لتطبيق ويب: اسم، باب، علامة التحقق للوضع، سلسلة النسخة، إعدادات قاعدة البيانات، الأصول المسموح بها. لا شيء معقد. هذا هو المكان الذي تظهر فيه الفروق بين التنسيقات.

تومل

# App configuration
[app]
name = "my-app"
port = 3000
debug = false
version = "1.2.3"
allowed_origins = ["https://example.com", "https://api.example.com"]

[database]
host = "localhost"
port = 5432
name = "mydb"

يامل

# App configuration
app:
  name: my-app
  port: 3000
  debug: false
  version: "1.2.3"
  allowed_origins:
    - https://example.com
    - https://api.example.com

database:
  host: localhost
  port: 5432
  name: mydb

JSON

{
  "app": {
    "name": "my-app",
    "port": 3000,
    "debug": false,
    "version": "1.2.3",
    "allowed_origins": [
      "https://example.com",
      "https://api.example.com"
    ]
  },
  "database": {
    "host": "localhost",
    "port": 5432,
    "name": "mydb"
  }
}

في المقدمة

ميزةتوملياملJSON
تعليقات✅ نعم✅ نعم❌ لا
استنتاج نوعيمُعلنمُفرط (غالبًا ما يكون خاطئًا)مُعلن
المصفوفات= ["a", "b"]- item أو مُدرج داخلياً["a", "b"]
المسافات الخلفيةلا يوجدلا يوجد❌ غير قانوني
إعدادات متعددة الطبقاتيصبح مُفصّلًا بسرعةقابل للقراءة إلى حد مامُفصّل لكنه واضح
استقرار نوع الإعدادTOML 1.0 (2021، مستقر)الصراع بين مُحلّل 1.1 و 1.2مُستقر
دعم القيمة الصفرية❌ لا نوع فارغ✅ نعم (~ أو null)✅ نعم (null)
الاستخدام الشائعCargo.toml، pyproject.tomlGitHub Actions، k8s، Dockerpackage.json، tsconfig.json

YAML: الأفضل في القراءة حتى يصبح غير ذلك

يبدو YAML رائعًا في العروض. يُشبه المحتوى المكتوب بشكل مبسط. تبدأ المشاكل عندما تصل إلى حالة حدودية واحدة — وعندئذ يكون ملف الإعداد مُعتمدًا كبنية أساسية.

مشكلة النرويج

في YAML 1.1 — الذي يُستخدمه معظم المُحلّلين بشكل افتراضي — تكون هذه القيم جميعها منطقيًا: y, n, yes, no, on, off, true, falseإذًا country: NO يُحلّل كـ country: false. هذا هو السبب الحقيقي وراء تسميتها بمشكلة النرويج — رمز الدولة لنرويج هو NO. تحسّن PyYAML في الإصدار 6.0 (مُصدر في 2022). لم يُعالج سناكYAML (الذي يستخدمه الكثير من أدوات لغة جافا) بشكل كامل. تحقق من مُحلّلك قبل استخدام القيم المُباشرة في إعداداتك. no أو yes في قيم الإعدادات.

استنتاج نوعي خاطئ

القيم غير المُقتَصَّدة في YAML تُحوّل إلى نوع معين. port: 8080 تُحوّل إلى عدد. version: 1.10 تُحوّل إلى العدد العشري 1.1 — منطقيًا متساوي، لكنه خاطئًا. تنسى وضع علامة تنصيص على سلسلة النسخة وستقضي عشر دقائق في التساؤل عن سبب افتراض تطبيقك أن النسخة هي v1.1 بدلًا من v1.10. الحل بسيط: اجعل كل شيء يجب أن يبقى سلسلة مُقَصَّدة. لكن YAML لا يُجبرك على ذلك، لذا لا يفعل ذلك.

التباعد يُعدّ مُعتمدًا

المسافات في YAML غير مسموحة — ليس مُستحسنًا، مُستبعدًا. إذا مزجت تباعدًا بمسافتين ومسافتين أربع مرات داخل ملف، فستحصل على خطأ تحليل يشير غالبًا إلى السطر الخاطئ. GitHub Actions هي الحافة الأكثر حدة هنا: يفشل مُدخل المُحتوى في التشغيل، وليس في التحليل، لأن مُشغلات العمل لا تتحقق من هيكل الخطوات، بل فقط من سلوك النص. ستحصل على "قيمة غير متوقعة" من مهمة CI بدون أي إشارة إلى أي خطوة فشلت، وستقضي 20 دقيقة في إضافة مخرجات تشغيل قبل أن تدرك أن المشكلة كانت تباعدًا بمسافة مزدوجة بدلًا من مسافة أربع. run: يُفشل الوضع أثناء التشغيل، وليس أثناء تحليل النص، لأن مُشغلات العمل لا تتحقق من هيكل الخطوات، بل فقط من صيغة التعليمات. ستحصل على "قيمة غير متوقعة" من مهمة CI دون أي إشارة إلى الخطوة التي فشلت فيها، وستستغرق 20 دقيقة في إضافة مخرجات تشغيلية قبل أن تدرك أن المشكلة كانت تلميح بمسافة مسافتين بدلًا من أربع.

إذا أصبح ملفك YAML مُختلًا من حيث التباعد غير المتسق، فإن مُصاغ YAML سيُنظّم قبل أن تبدأ في التحقيق.

TOML: التنسيق الذي فكر حقًا في الإعدادات

تم بناء TOML من قبل توم برينستون-وينر (أحد مؤسسي جيت هاب) لأنه كان متعبًا من كتابة إعدادات من نوع INI مع سلوك تحليل غير متسق، وتم تجربة إعدادات YAML التي تُفاجئه. وصلت إصدار 1.0 من TOML في يناير 2021 بعد سنوات من التعديلات. أصبح الآن المعيار في مشاريع روس (Cargo.toml)، تعبئة برمجيات بايثون (pyproject.toml)، وملفات هوجو. وصفه مستقر، ومُحلّلاته متسقة، ونظام الأنواع يفعل ما تريده.

ما يحصل عليه

  • لا توجد تحوّلات نوعية غير متوقعة. version = "1.10" هي دائمًا سلسلة. port = 3000 هي دائمًا عدد. ما تكتبُه هو ما تُحصل عليه.
  • التعليقات تعمل تمامًا كما تُتوقع (# إلى نهاية السطر)، مقارنة بـ JSON.
  • الإعدادات المسطحة إلى متوسطة التعمق قابلة للقراءة بشكل حقيقي، مقارنة بـ JSON المتعمق.

نظام المصفوفة المُكوّنة من الجداول

العائق الرئيسي في TOML هو نظام المصفوفة المكوّنة من الجداول. إذا كنت ترغب في مصفوفة من الأشياء — مثل عدة اتصالات بقاعدة بيانات — فإن التمثيل يشبه هذا:

[[databases]]
name = "primary"
host = "db1.example.com"

[[databases]]
name = "replica"
host = "db2.example.com"

كل [[double bracket]] مقطع هو عنصر واحد في المصفوفة. databases يُعمل. هو واضح. لكن كل مطوّر يفتح ملف TOML لأول مرة يسأل "هل هذا يشبه INI؟" — لأنه يبدو كأنه كذلك. هذه الغرابة لها تكلفة حقيقية عندما تُدخل مساهمين لم يرَوا TOML من قبل.

TOML لديه أيضًا لا null نوع — بشكل متعمد. إذا استخدمت نمط "الصفر" لتعني "الحقل موجود لكنه مُستبعد بشكل صريح"، فستحتاج إلى نمط مختلف (إزالة الحقل بالكامل، أو استخدام قيمة مُستندة). وتصبح الإعدادات المتعددة الطبقات مُفصّلة بسرعة: TOML لا يمتلك نظام الـ Anchor / Alias في YAML لاستخدام مجموعات مُكررة، لذا يصبح هناك الكثير من النسخ المُكررة إذا كان ملف الإعداد يحتوي على هيكل مكرر.

ال مُصاغ TOML مفيد عند محاولة تنظيف ملف TOML الذي نشأ بشكل طبيعي على مر الزمن.

JSON: العدو الذي تعرفه

تم تصميم JSON للتبادل بين البيانات — بين الأجهزة — وليس للإنسان في كتابة ملفات الإعداد. انتهى به المطاف كتنسيق إعدادات لأن كل لغة كانت تمتلك مُحلّلًا للـ JSON، وتم تفوّض هذا الراحة. الآن لدينا package.json، tsconfig.json، .eslintrc.json، وحوالي 40 ملف إعدادات JSON في كل مشروع برمجي باللغة JavaScript، وكلها تُكتب يدويًا.

لا توجد تعليقات. لا يزال.

أزل دايفو كروكفورد تعليقات JSON بشكل عمد في عام 2012 — كان يخشى أن يستخدم المطورونها كتعليمات تحليل (مثلاً مثل تعليقات IE). تستمر الشكاوى على الإنترنت منذ ذلك الحين. الحلول التي يستخدمها الناس:

  • JSONC — JSON مع تعليقات. يستخدمه VS Code لـ settings.json و launch.json. غير قابل للتحليل من قبل مُحلّل JSON القياسي. غير معياري.
  • JSON5 — يضيف تعليقات، مسافات خلفية، مفاتيح غير مُقَصَّدة، سلاسل متعددة الأسطر. له وصف وحلّل منفصل. يستخدمه بابل لملفات الإعداد. لا يزال غير معياري.
  • أ "_comment" مفتاح — حقل سلسلة يحتوي على نص التعليق. يعمل. يبدو مُضحكًا. يدخل في نموذج البيانات.

فواصل لاحقة

أيضًا غير قانوني. أضف مسافة خلفية بعد العنصر الأخير في المصفوفة أو المجموعة و JSON.parse يُنذر SyntaxError: Unexpected token } — يخبرك بوجود مشكلة، لكنه لا يُظهر مكان المسافة المُضافة. هذا هو الخطأ الأكثر شيوعًا في ملفات JSON المُكتوبة يدويًا، ويحدث لأنه في كل لغة حديثة (مصفوفات JavaScript، مجموعات Python، أنواع Rust) يسمح بالمسافات الخلفية، ويكتب الناس ملفات JSON يدويًا بذات السلوكيات.

ما يحصل عليه JSON

نظام الأنواع واضح وشامل. يتفق كل مُحلّل JSON في كل لغة على ما يعنيه true, 1, "1"و، و null . يُعدّ JSON Schema من أفضل خيارات التحقق من صحة الإعدادات الثلاثة — يستخدمه VS Code لتحقق من tsconfig.json وpackage.json داخل البرنامج، مع توضيح الأخطاء مباشرة. عندما يُكتب الإعدادات من قبل الأدوات (webpack، tsc، npm)، لا تهتم بسهولة القراءة — ذلك هو ما يُستخدمه تنسيق JSON لذلك.

الاستنتاج: اختر بناءً على السياق، وليس على التفضيل

استخدم JSON عندما يُنتج أو يستهلك من قبل الأدوات (package.json، tsconfig، إعدادات AWS، ردود API على GitHub)، أو عندما تحتاج إلى تحقق من صحة JSON Schema. لا تُعارضه بكتابة ملفات يدويًا أكثر من اللازم. يُضر عدم وجود تعليقات، لكن الانتشار الواسع ودعم الأدوات يصعب التناقض معه.

استخدم YAML عندما يكون الملف الإعدادي مُكتوبًا بشكل أساسي من قبل الإنسان، وله هيكل مسطّح — مثل مسارات GitHub Actions، ملفات Docker Compose، ملفات Kubernetes. اجعل كل شيء يمكن أن يُخطئ كقيمة عددية أو منطقية مُقَصَّدة (مثلاً سلسلة النسخة، رمز الدولة، أي شيء يبدأ برقم). اجعل مُدققًا. لا تستخدم التباعد. عدّ استنتاج الأنواع كخطأ، وليس كميزة.

استخدم TOML عندما تتحكم في اختيار التنسيق وترغب في تجنب تحوّلات نوع غير متوقعة. هو الأكثر صراحة بين الثلاثة حول ما هو عليه. إذا كنت تبدأ مشروعًا جديدًا وليست هناك أدوات تفرض تنسيقًا، فإن TOML هو الأقل احتمالًا ليخيبك بعد ستة أشهر. تكلفة الغرابة هي مصطلح واحد؛ الوضوح هو دائم.

هل تريد حذف الإعلانات؟ تخلص من الإعلانات اليوم

تثبيت ملحقاتنا

أضف أدوات IO إلى متصفحك المفضل للوصول الفوري والبحث بشكل أسرع

أضف لـ إضافة كروم أضف لـ امتداد الحافة أضف لـ إضافة فايرفوكس أضف لـ ملحق الأوبرا

وصلت لوحة النتائج!

لوحة النتائج هي طريقة ممتعة لتتبع ألعابك، يتم تخزين جميع البيانات في متصفحك. المزيد من الميزات قريبا!

إعلان · حذف؟
إعلان · حذف؟
إعلان · حذف؟

ركن الأخبار مع أبرز التقنيات

شارك

ساعدنا على الاستمرار في تقديم أدوات مجانية قيمة

اشتري لي قهوة
إعلان · حذف؟