Skip to content
Back to Blog
informational

TOML क्या है? कॉन्फ़िग लैंग्वेज जिसने YAML को मात दी

2026-05-17 9 min read

TOML वास्तव में क्या है

TOML का मतलब टॉम्स ऑब्वियस, मिनिमल लैंग्वेज (Tom's Obvious, Minimal Language) है। इसके निर्माता, GitHub के सह-संस्थापक टॉम प्रेस्टन-वर्नर (Tom Preston-Werner), 2013 में मौजूदा कॉन्फ़िग प्रारूपों से तंग आ गए थे। यह भाषा लगभग आठ साल तक परिपक्व हुई, जिसके बाद जनवरी 2021 में इसका पहला स्थिर संस्करण, TOML v1.0.0, जारी किया गया। यह लंबी परिष्करण अवधि बताती है कि इसके डिज़ाइन पर कितनी गंभीरता से विचार किया गया था। अपने मूल में, TOML एक कॉन्फ़िगरेशन फ़ाइल प्रारूप है। यह JSON की तरह सामान्य-उद्देश्य वाला डेटा सीरियलाइज़ेशन प्रारूप नहीं है, न ही यह एक मार्कअप भाषा है। इसका पूरा लक्ष्य यह है कि मानव के लिए इसे पढ़ना और लिखना बेहद आसान हो, जबकि यह स्पष्ट रूप से एक हैश टेबल पर मैप हो सके—या जिसे आप अपनी पसंद की भाषा में डिक्शनरी, मैप या ऑब्जेक्ट कह सकते हैं। एक न्यूनतम TOML फ़ाइल बेहद आसान होती है: ``` title = "My Application" version = "2.4.1" debug = false [database] host = "localhost" port = 5432 max_connections = 100 ``` हर मान का एक स्पष्ट प्रकार होता है। `"localhost"` एक स्ट्रिंग है। `5432` एक पूर्णांक है। `false` एक बूलियन है—न कि स्ट्रिंग `"false"`, न `0`, और न ही `null`। यह सख्ती ही इसका मुख्य बिंदु है, और यही एक प्राथमिक कारण है कि डेवलपर्स TOML चुनते हैं। आपको कभी यह सोचने में समय बर्बाद नहीं करना पड़ेगा कि किसी विशेष YAML लाइब्रेरी की अजीबोगरीब खासियत के कारण आपका पोर्ट नंबर एक स्ट्रिंग के रूप में पार्स होगा या एक पूर्णांक के रूप में।

YAML एक ऐसी समस्या क्यों बन गया जिसे हल करना ज़रूरी था

YAML को मानव-अनुकूल होने के लिए बहुत सराहना मिलती है। छोटी फ़ाइलों के लिए, यह सच है। लेकिन जैसे ही आपका कॉन्फ़िगरेशन बढ़ता है, इसकी यह मित्रता तेज़ी से गायब हो जाती है, और इसके डिज़ाइन विकल्प समस्याएं पैदा करना शुरू कर देते हैं। सबसे कुख्यात उदाहरण नॉर्वे समस्या है। YAML 1.1 में—जो अभी भी कई पार्सर के लिए डिफ़ॉल्ट है—दो-अक्षर वाला देश कोड `NO` को बूलियन मान `false` के रूप में पार्स किया जाता है। `country: NO` जैसा कॉन्फ़िगरेशन चुपचाप आपके डेटा को भ्रष्ट कर देगा। यह विभिन्न कैपिटलाइज़ेशन में `yes`, `no`, `on`, `off`, `true`, और `false` पर भी लागू होता है। YAML 1.2 ने इसे ठीक कर दिया, लेकिन आप हमेशा यह नियंत्रित नहीं कर सकते कि आपके उपकरण किस पार्सर संस्करण का उपयोग कर रहे हैं। फिर महत्वपूर्ण व्हाइटस्पेस की बात आती है। YAML संरचना को परिभाषित करने के लिए इंडेंटेशन का उपयोग करता है, इसलिए एक भी गलत जगह पर रखा गया स्पेस चुपचाप आपकी फ़ाइल का पूरा अर्थ बदल सकता है या उसे पूरी तरह से तोड़ सकता है। जिसने भी CI/CD पाइपलाइन को डीबग करने में एक घंटा बर्बाद किया हो और बाद में दो-स्पेस बनाम चार-स्पेस की असंगति का पता चला हो, वह इस दर्द को अच्छी तरह जानता है। YAML एक ही चीज़ लिखने के बहुत सारे तरीके भी प्रदान करता है। स्केलर सादे, सिंगल-कोटेड, डबल-कोटेड या ब्लॉक स्टाइल में हो सकते हैं। सीक्वेंस फ्लो या ब्लॉक स्टाइल में हो सकते हैं। यह लचीलापन अच्छा लगता है, लेकिन इसका मतलब है कि दो डेवलपर एक ही लॉजिकल कॉन्फ़िगरेशन को पूरी तरह से अलग-अलग तरीकों से लिखेंगे, जिससे डिफ्स को पढ़ना कठिन हो जाता है और कोड समीक्षाएं कम प्रभावी होती हैं। इससे YAML बेकार नहीं हो जाता। Kubernetes मैनिफेस्ट और GitHub Actions वर्कफ़्लो के लिए यह एक मानक है, और इसका एक कारण है। लेकिन एप्लिकेशन कॉन्फ़िगरेशन के लिए, जहाँ शुद्धता और पूर्वानुमेयता किसी भी चीज़ से ज़्यादा मायने रखती है, ये अजीबोगरीब खासियतें एक गंभीर दायित्व हैं।

TOML पठनीयता की समस्या को कैसे हल करता है

TOML का दर्शन सरल है: किसी चीज़ को लिखने का एक, और केवल एक ही, स्पष्ट तरीका होना चाहिए। यह प्रतिबंधात्मक लग सकता है, लेकिन इसका परिणाम ऐसे कॉन्फ़िगरेशन फ़ाइलें हैं जो एक जैसी दिखती और महसूस होती हैं, चाहे उन्हें किसी ने भी लिखा हो या वे किसी भी प्रोजेक्ट से संबंधित हों। यह छह स्केलर प्रकार प्रदान करता है: स्ट्रिंग, पूर्णांक, फ्लोट, बूलियन, ऑफ़सेट डेट-टाइम और लोकल डेट। RFC 3339 प्रारूप में दिनांक और समय के लिए TOML का फर्स्ट-क्लास समर्थन एक कमाल का फीचर है। आप `created_at = 2024-03-15T09:30:00Z` लिख सकते हैं और भरोसा कर सकते हैं कि यह एक सही डेटटाइम ऑब्जेक्ट बन जाएगा, न कि ऐसी स्ट्रिंग जिसे आपको खुद पार्स करना पड़े। जबकि YAML दिनांकों को दर्शा सकता है, पार्सर के बीच व्यवहार असंगत होता है। संरचना को टेबल्स (सेक्शन) और टेबल्स के एरे से परिभाषित किया जाता है। एक टेबल को स्क्वायर ब्रैकेट में हेडर मिलता है: `[server]`। टेबल्स का एक एरे डबल स्क्वायर ब्रैकेट का उपयोग करता है: `[[products]]`। सिंटैक्स स्पष्ट और आसानी से पहचाना जा सकता है। यहां एक Rust `Cargo.toml` फ़ाइल का वास्तविक-विश्व उदाहरण दिया गया है, जिसमें दिखाया गया है कि निर्भरताएँ कैसे परिभाषित की जाती हैं: ``` [dependencies] serde = { version = "1.0", features = ["derive"] } tokio = { version = "1", features = ["full"] } reqwest = "0.12" ``` इनलाइन टेबल सिंटैक्स—जो घुंघराले ब्रैकेट में है—सरल, कॉम्पैक्ट परिभाषाओं के लिए बेहतरीन है। अधिक जटिल नेस्टेड डेटा के लिए, आप पूर्ण टेबल हेडर का उपयोग करते हैं। यह भाषा आपको स्पष्ट नियम देती है कि प्रत्येक स्टाइल का उपयोग कब करना है। यहां तक कि टिप्पणियाँ भी परिचितता के लिए डिज़ाइन की गई हैं। वे `#` कैरेक्टर का उपयोग करती हैं, बिलकुल Python और शेल स्क्रिप्ट की तरह। अधिकांश डेवलपर्स स्पेक की एक भी लाइन पढ़े बिना पहले से ही सिंटैक्स जानते हैं।

TOML कहाँ जीता है: वास्तविक अपनाने के आंकड़े

Rust इकोसिस्टम TOML की सबसे बड़ी सफलता की कहानी है। Cargo, Rust का पैकेज मैनेजर, अपने मैनिफेस्ट के लिए TOML को अनिवार्य करता है। 2025 की शुरुआत तक crates.io पर 1,50,000 से अधिक पैकेज होने के साथ, हर एक में एक `Cargo.toml` फ़ाइल है। यह एक विशाल, वास्तविक-विश्व तनाव परीक्षण है जिसे बहुत कम प्रारूपों ने कभी पास किया है। PEP 518 (2016) और PEP 621 (2021) के माध्यम से Python द्वारा अपनाने ने `pyproject.toml` को प्रोजेक्ट मेटाडेटा और बिल्ड कॉन्फ़िगरेशन के लिए एकमात्र सही जगह के रूप में स्थापित किया। Poetry, Hatch, Flit और PDM जैसे सभी उपकरण इसका उपयोग करते हैं। आपकी लिंटर सेटिंग्स `[tool.ruff]` में जाती हैं, आपकी टेस्ट सेटिंग्स `[tool.pytest.ini_options]` में। आपको उन सभी को नियंत्रित करने के लिए एक फ़ाइल और एक प्रारूप मिलता है। लोकप्रिय स्टैटिक साइट जेनरेटर Hugo ने YAML और JSON से दूर हटते हुए TOML को अपना डिफ़ॉल्ट कॉन्फ़िगरेशन प्रारूप बनाया। टीम ने विशेष रूप से TOML की स्पष्टता और आश्चर्यजनक प्रकार के जबरन परिवर्तन की कमी को प्रेरणा के रूप में उद्धृत किया। जब कोई भाषा अपनी मानक लाइब्रेरी में एक पार्सर जोड़ती है, तो आप जानते हैं कि प्रारूप आ गया है। Python ने संस्करण 3.11 (अक्टूबर 2022 में जारी) में `tomllib` जोड़कर ठीक ऐसा ही किया, जिससे आप शून्य बाहरी निर्भरता के साथ किसी भी आधुनिक Python इंस्टाल पर TOML फ़ाइलों को पार्स कर सकते हैं। यह सिर्फ Python और Rust की बात नहीं है। Go, .NET और JavaScript सभी में परिपक्व, अच्छी तरह से बनाए गए TOML लाइब्रेरी हैं। उदाहरण के लिए, npm पर `@iarna/toml` पैकेज को हर हफ्ते लाखों डाउनलोड मिलते हैं। TOML आधिकारिक तौर पर मुख्यधारा में है।

TOML की वास्तविक सीमाएँ

कोई भी उपकरण सही नहीं होता, और TOML भी इसका अपवाद नहीं है। इसकी सीमाओं के बारे में ईमानदार रहना महत्वपूर्ण है ताकि आप जानें कि कब किसी और चीज़ का सहारा लेना है। गहराई से नेस्टेड डेटा TOML की कमजोर कड़ी है। यदि आपको नेस्टिंग के दो या तीन स्तरों से अधिक की आवश्यकता है, तो सिंटैक्स दर्दनाक हो जाता है। आप खुद को `[servers.production.database.replica]` जैसी लंबी, डॉटेड कीज़ लिखते हुए पाएंगे। यह वैध है, लेकिन पठनीय नहीं है। JSON और यहां तक कि YAML भी इसमें बेहतर हैं क्योंकि वे सामान्य डेटा प्रतिनिधित्व के लिए बनाए गए थे। जटिल ऑब्जेक्ट्स के बड़े एरे एक और कमजोर बिंदु हैं। टेबल्स के एरे (`[[products]]`) के लिए सिंटैक्स का मतलब है कि आपको हर एक आइटम के लिए उस हेडर को दोहराना पड़ता है। 50 उत्पादों की सूची के परिणामस्वरूप 50 अलग-अलग `[[products]]` हेडर होते हैं। उस बिंदु पर, आप कॉन्फ़िग फ़ाइल नहीं लिख रहे हैं; आप गलत उपकरण का उपयोग कर रहे हैं। आपको JSON या डेटाबेस का उपयोग करना चाहिए। TOML में एंकर और एलियास के लिए समर्थन का अभाव है, एक ऐसी सुविधा जो YAML `&anchor` और `*alias` के साथ प्रदान करता है। इसका मतलब है कि आप सेटिंग्स के एक ब्लॉक को एक बार परिभाषित नहीं कर सकते और उसे अपनी फ़ाइल में फिर से उपयोग नहीं कर सकते। यदि आपको कॉन्फ़िगरेशन दोहराना है, तो आपके पास दो विकल्प हैं: इसे सीधे डुप्लिकेट करें, या अपने एप्लिकेशन कोड में मर्जिंग लॉजिक बनाएं। इसे DRY (Don't Repeat Yourself) रखने का कोई अंतर्निहित तरीका नहीं है। अंत में, आप एक TOML फ़ाइल को स्ट्रीम नहीं कर सकते। JSON लाइन्स के विपरीत, किसी भी मान तक पहुंचने से पहले एक TOML दस्तावेज़ को पूरी तरह से पढ़ना और पार्स करना होगा। यह बहुत बड़ी कॉन्फ़िगरेशन फ़ाइलों के लिए मायने रख सकता है, हालांकि इतनी बड़ी कॉन्फ़िग फ़ाइल अक्सर एक गहरी डिज़ाइन समस्या का लक्षण होती है। ये सीमाएँ TOML को उसके इच्छित उद्देश्य: मध्यम जटिलता के एप्लिकेशन कॉन्फ़िगरेशन के लिए बुरा विकल्प नहीं बनातीं। वे बस इसकी सीमाओं को परिभाषित करती हैं।

TOML और अन्य प्रारूपों के बीच रूपांतरण

यदि आप किसी प्रोजेक्ट को YAML से माइग्रेट कर रहे हैं या किसी उपकरण के लिए प्रारूपों के बीच कॉन्फ़िग डेटा को परिवर्तित करने की आवश्यकता है, तो आपके पास कुछ विकल्प हैं। Python में प्रोग्रामेटिक रूप से परिवर्तित करने के लिए, आप `tomllib` (पढ़ने के लिए) और `tomli-w` (लिखने के लिए) लाइब्रेरी को `PyYAML` जैसे YAML पार्सर के साथ जोड़ सकते हैं। `yaml.safe_load()` के साथ एक YAML फ़ाइल को Python डिक्शनरी में पढ़ना और फिर `tomli_w.dumps()` के साथ उसे लिखना काम करता है, लेकिन यह फ्लैट या मध्यम रूप से नेस्टेड फ़ाइलों के लिए सबसे अच्छा है। गहराई से नेस्टेड संरचनाओं, YAML एंकरों, या मल्टी-डॉक्यूमेंट फ़ाइलों को मैन्युअल सफ़ाई की आवश्यकता होगी। JSON-से-TOML रूपांतरण के लिए, मैपिंग कहीं अधिक साफ-सुथरी है क्योंकि दोनों प्रारूपों में स्पष्ट प्रकार होते हैं। एक JSON पूर्णांक एक TOML पूर्णांक बन जाता है। एक JSON बूलियन एक TOML बूलियन बन जाता है। मुख्य संरचनात्मक बदलाव JSON ऑब्जेक्ट्स के एरे को TOML टेबल्स के एरे (`[[table]]`) में बदलना है, जिसे एक अच्छा कनवर्टर संभाल सकता है। CocoConvert जैसे ऑनलाइन उपकरण आपके लिए रूपांतरण संभाल सकते हैं। एक JSON या YAML फ़ाइल अपलोड करें, आउटपुट प्रारूप के रूप में TOML चुनें, और कनवर्टर काम करता है। यह सीधी-सादी कॉन्फ़िग फ़ाइलों के लिए एक बढ़िया विकल्प है। YAML-विशिष्ट सुविधाओं जैसे एंकर या गहराई से नेस्टेड संरचनाओं वाली फ़ाइलों के लिए, आपको अभी भी आउटपुट की समीक्षा करने की आवश्यकता होगी। जब CocoConvert को कुछ ऐसा मिलता है जो TOML पर साफ-सुथरा मैप नहीं होता है, तो वह रूपांतरण चेतावनियाँ देगा, लेकिन यह आपके लिए आपके डेटा संरचना को फिर से व्यवस्थित नहीं कर सकता—यह एक ऐसा निर्णय है जिसे आपको लेना होगा। बल्क माइग्रेशन के लिए, जैसे 40 YAML फ़ाइलों के पूरे रिपॉजिटरी को परिवर्तित करना, उन्हें एक-एक करके अपलोड करना संभव नहीं है। CocoConvert API इसी के लिए बनाया गया है, जिससे आप अनुरोधों को बैच कर सकते हैं और पूरी प्रक्रिया को स्वचालित कर सकते हैं।

क्या आपको अपने प्रोजेक्ट को TOML में स्विच करना चाहिए?

तो, क्या आपको स्विच करना चाहिए? उत्तर आपके प्रोजेक्ट और उसके टूलचेन की अपेक्षाओं पर निर्भर करता है। 2025 में एक नए Python प्रोजेक्ट के लिए, उत्तर एक जोरदार हाँ है। `pyproject.toml` का उपयोग करें। पारिस्थितिकी तंत्र ने इसे मानकीकृत कर दिया है, और इससे लड़ना केवल अनावश्यक घर्षण पैदा करता है। वह व्यक्ति न बनें जो एक अलग `ruff.toml` बनाता है जब मानक प्रोजेक्ट की मुख्य कॉन्फ़िग फ़ाइल में `[tool.ruff]` सेक्शन का उपयोग करना है। यदि आप एक Rust प्रोजेक्ट लिख रहे हैं, तो यह तो सवाल ही नहीं है। Cargo TOML का उपयोग करता है, और यह एक विशेषता है, कोई बग नहीं। प्रारूप की निरंतरता एक बड़ा कारण है कि Rust के उपकरण इतने सुसंगत क्यों लगते हैं। मौजूदा प्रोजेक्ट के लिए जिसमें YAML कॉन्फ़िगरेशन काम कर रहा है, मैं कहूंगा कि तभी माइग्रेट करें जब वह YAML दर्द का स्रोत हो। यदि आपकी `config.yaml` स्थिर है और टीम उसे समझती है, तो बदलने की लागत—दस्तावेज़ों, स्क्रिप्ट्स और लोगों की आदतों को अपडेट करना—शायद TOML का उपयोग करने की 'शुद्धता' के लायक नहीं है। Kubernetes और CI/CD (GitHub Actions, GitLab CI, आदि) की दुनिया में, YAML ही राजा है। आपके पास कोई विकल्प नहीं है, और TOML उस क्षेत्र में इसे हटाने की कोशिश नहीं कर रहा है। असली परख की कसौटी यह है: क्या आप अपनी YAML फ़ाइल में टिप्पणियाँ लिख रहे हैं ताकि यह बताया जा सके कि किसी मान का डेटा प्रकार *क्या होना चाहिए*? क्या आप एक संख्या को स्ट्रिंग के रूप में पढ़े जाने के कारण होने वाले बग का पीछा कर रहे हैं? यह आपका संकेत है। आप YAML की अस्पष्टता से आगे निकल गए हैं। TOML को ठीक इसी तरह की समस्या को हल करने के लिए डिज़ाइन किया गया था, जिसमें शुरुआत से ही प्रकारों को स्पष्ट किया गया था।

TOML क्या है? कॉन्फ़िग लैंग्वेज जिसने YAML को मात दी | CocoConvert Blog