एक वाक्य में
YAML एक human-readable data serialization language है जो data structures को व्यक्त करने के लिए indentation और न्यूनतम punctuation का उपयोग करता है, जो इसे उन configuration files के लिए पसंदीदा बनाता है जिन्हें लोगों को वास्तव में लिखना और पढ़ना पड़ता है।
यह कौन सी समस्या हल करता है
शुरुआत में, अराजकता थी। या, अधिक सटीक रूप से, XML जैसे format थे। अगर आप structured data—जैसे, किसी user की settings—को store करना चाहते थे, तो आप इसे angle brackets के जंगल में लपेट देते थे। यह powerful, machine-readable, और किसी इंसान के लिए बिना गलती किए edit करने के लिए एक बुरा सपना था।
<user>
<name>Alex</name>
<roles>
<role>editor</role>
<role>admin</role>
</roles>
<active>true</active>
</user>
फिर आया JSON (JavaScript Object Notation)। यह ताज़ी हवा के झोंके जैसा था! JavaScript object syntax से प्रेरित होकर, इसने angle brackets को curly braces, square brackets, और colons से बदल दिया। यह हल्का, साफ-सुथरा था और हर जगह APIs के लिए de facto standard बन गया।
{
"name": "Alex",
"roles": [
"editor",
"admin"
],
"active": true
}
लेकिन जब इंसान काम कर रहे हों तो JSON में भी अपनी कमियाँ होती हैं। वे सारे commas, quotes, और braces सिंटैक्टिक जाल हैं। एक comma भूल गए? पूरी file invalid हो गई। यह समझाने के लिए एक comment जोड़ना चाहते हैं कि कोई setting एक निश्चित तरीके से क्यों है? बहुत बुरा हुआ, JSON comments का support नहीं करता है।
यह वह जगह है जिसे भरने के लिए 2000 के दशक की शुरुआत में YAML का जन्म हुआ था। इसका नाम, एक recursive acronym, सब कुछ कहता है: YAML Ain't Markup Language (YAML एक मार्कअप भाषा नहीं है)। यह पूरी तरह से एक data format होने पर केंद्रित है, न कि एक document-marking system पर। बनाने वालों का प्राथमिक लक्ष्य इंसानों के लिए पठनीयता और लिखने में आसानी को optimize करना था। उन्होंने Python के साफ, indented structure को देखा और सोचा, "क्या होगा अगर हम इसका उपयोग data के लिए कर सकें?" परिणाम एक ऐसा format है जो code जैसा कम और एक अच्छी तरह से संगठित रूपरेखा जैसा अधिक दिखता है।
अंदर की कहानी
YAML का जादू इसकी सादगी और JSON के साथ इसके संबंध में निहित है। इसके मूल में, एक YAML पार्सर एक text file को पढ़ता है और मेमोरी में एक abstract data structure बनाता है - यह प्रक्रिया JSON पार्सर के काम करने के तरीके से बहुत अलग नहीं है। यही कारण है कि YAML और JSON के बीच convert करना इतना सहज है; वे एक ही मौलिक अवधारणाओं का प्रतिनिधित्व करते हैं, बस अलग-अलग कपड़ों में।
Indentation का खेल
यह YAML की परिभाषित विशेषता है। जहाँ JSON नेस्टिंग दिखाने के लिए {} और [] का उपयोग करता है, वहीं YAML व्हाइटस्पेस का उपयोग करता है। नियम सरल है: यदि कोई लाइन ऊपर की लाइन से अधिक indented है, तो वह उस लाइन का child है।
- नियम #1: Spaces का उपयोग करें, tabs का नहीं। दुनिया इस पर सामूहिक रूप से सहमत हो गई है ताकि alignment की गड़बड़ी से बचा जा सके।
- नियम #2: सुसंगत रहें। यदि आप अपने पहले स्तर के indentation के लिए 2 spaces का उपयोग करते हैं, तो सभी पहले स्तरों के लिए 2 spaces का उपयोग करें।
अंतर देखिए। संरचना समान है, लेकिन YAML संस्करण साफ-सुथरे नोट्स के एक सेट जैसा लगता है।
JSON:
{
"server": {
"port": 8080,
"security": {
"enable_https": true
}
}
}
YAML:
server:
port: 8080
security:
enable_https: true
मूलभूत अंग: Scalars, Sequences, और Mappings
YAML data तीन बुनियादी चीजों से बना है:
- Mappings (Objects/Dictionaries): ये key-value pairs होते हैं। YAML में, आप उन्हें
key: valueके रूप में लिखते हैं। colon के बाद space अनिवार्य है!# A simple mapping name: "Alex" email: alex@example.com - Sequences (Lists/Arrays): ये items की क्रमित सूचियाँ हैं। आप प्रत्येक item को एक hyphen और एक space (
-) से दर्शाते हैं।# A simple sequence of roles - editor - admin - contributor - Scalars (Values): यह वास्तविक डेटा है: strings, numbers, booleans। YAML की सबसे अनुकूल विशेषताओं में से एक यह है कि आपको अक्सर अपने strings को quote करने की आवश्यकता नहीं होती है।
name: Alexठीक काम करता है। आपको quotes की आवश्यकता तभी होती है जब आपके string में विशेष वर्ण हों या उसे किसी अन्य प्रकार के रूप में गलत समझा जा सकता हो (जैसेtrueया5.0)।
इनको मिलाकर आप लगभग किसी भी data structure को प्रस्तुत करने की शक्ति प्राप्त करते हैं।
# A list of user objects
- name: Alex
email: alex@example.com
roles:
- editor
- admin
- name: Bailey
email: bailey@example.com
roles:
- contributor
एडवांस्ड जादूगरी: Anchors, Aliases, और Tags
YAML के पास कुछ ऐसी तरकीबें हैं जो JSON में नहीं हैं, मुख्य रूप से आपकी files को DRY (Don't Repeat Yourself) रखने के लिए।
Anchors (
&) और Aliases (*): एक anchor आपको डेटा के एक हिस्से को नाम देने देता है। एक alias आपको उस हिस्से को कहीं और reference करने देता है। यह जटिल configurations के लिए एक वरदान है जहाँ आपके पास दोहराए गए ब्लॉक होते हैं।# Define a default set of configurations with an anchor default_db_config: &db_defaults adapter: postgres pool: 5 timeout: 5000 # Use the defaults in different environments with an alias development: <<: *db_defaults # The << merges the alias in database: myapp_dev production: <<: *db_defaults database: myapp_prodयहां,
&db_defaultsएक पुन: प्रयोज्य टेम्पलेट बनाता है।*db_defaultsइसे कॉपी करता है। यदि आपको सभी environments के लिएtimeoutबदलने की आवश्यकता है, तो आपको इसे केवल एक ही स्थान पर बदलना होगा।Tags (
!): Tags यह स्पष्ट रूप से पार्सर को बताने का एक तरीका है कि कोई चीज़ किस प्रकार का डेटा है। आप शायद ही कभी उन्हें खुद लिखेंगे, लेकिन वे spec का हिस्सा हैं।!!str "123"पार्सर को "123" को एक संख्या के बजाय एक string के रूप में मानने के लिए मजबूर करता है।
असल दुनिया की कहानियाँ
परेशान DevOps Engineer
एक टीम Kubernetes पर अपने application infrastructure का प्रबंधन कर रही थी। हर service, deployment, और configuration map एक अलग .json file थी। जैसे-जैसे system बढ़ता गया, "ब्रैकेट ब्लाइंडनेस" भी बढ़ती गई। Pull requests पर diffs बेमेल braces और trailing comma परिवर्तनों का एक बुरा सपना थे। अंत में एक इंजीनियर तंग आ गया और उसने YAML में migration का नेतृत्व किया। अचानक, deployment.yaml files स्कैन करने योग्य हो गईं। यह समझाने के लिए comments जोड़े गए कि किसी service की एक विशिष्ट memory limit क्यों थी। एक environment variable में typo ढूंढना एक सिंटैक्टिक पहेली के बजाय एक विज़ुअल स्कैन बन गया।
सबक: जटिल, श्रेणीबद्ध कॉन्फ़िगरेशन के लिए जिसे अक्सर इंसानों द्वारा पढ़ा और संशोधित किया जाता है, YAML की पठनीयता जीवन की गुणवत्ता में एक बड़ा सुधार है।
Static Site Generator का प्रचारक
एक content टीम कंपनी के ब्लॉग को प्रबंधित करने के लिए एक static site generator (जैसे Hugo या Jekyll) का उपयोग कर रही थी। प्रत्येक पोस्ट "frontmatter" से शुरू होती थी, जो title, author, date, और tags के लिए metadata का एक ब्लॉक होता है। शुरुआती सेटअप में JSON frontmatter का उपयोग किया गया था। non-technical लेखक लगातार गायब commas या गलत तरीके से escaped quotes से परेशान रहते थे। एक डेवलपर ने frontmatter format को YAML में बदल दिया। सिंटैक्स इतना सहज था (title: My Post, author: Dale) कि लेखकों के support tickets शून्य हो गए। अब वे सिंटैक्स पर नहीं, बल्कि लिखने पर ध्यान केंद्रित कर सकते थे।
सबक: YAML का कम सिंटैक्टिक शोर इसे non-developers के लिए एक उत्कृष्ट "इंटरफ़ेस" बनाता है जिन्हें structured data के साथ इंटरैक्ट करने की आवश्यकता होती है।
Country Code के साथ 'धोखा'
एक डेवलपर अंतरराष्ट्रीय ऑर्डर प्रोसेस करने के लिए एक सिस्टम बना रहा था और दो-अक्षर वाले देश कोड को एक YAML config file में store करता था। US, DE, और JP के लिए सब कुछ बढ़िया काम कर रहा था। लेकिन जब नॉर्वे से एक ऑर्डर आया, तो सिस्टम क्रैश हो गया। घंटों की डिबगिंग के बाद, उन्हें अपराधी मिला। YAML file में country: NO था। YAML पार्सर ने अपनी अनंत सहायकता में, NO को boolean value false के रूप में समझा, न कि string "NO" के रूप में। समाधान सरल लेकिन निराशाजनक था: country: "NO"।
सबक: YAML का स्वचालित प्रकार अनुमान सुविधाजनक है लेकिन आश्चर्यजनक बग पैदा कर सकता है। जब संदेह हो, या ऐसे डेटा से निपट रहे हों जो boolean या संख्या जैसा दिखता हो, तो अपने strings को quote करें।
आम गलतियाँ और जाल
- Tabs बनाम Spaces। यह YAML का मूल पाप है। आपको indentation के लिए spaces का उपयोग करना चाहिए। अधिकांश संपादकों को tabs को spaces में auto-convert करने के लिए कॉन्फ़िगर किया जा सकता है, जो आपको इस विशेष प्रकार के सिरदर्द से बचाएगा।
- नॉर्वे वाली समस्या। जैसा कि ऊपर देखा गया है,
NO,YES,ON,OFFजैसे unquoted strings और यहां तक कि कुछ संख्याएं भी स्वचालित रूप से booleans या numeric types में परिवर्तित हो सकती हैं। एक सामान्य नियम यह है: यदि यह एक string है जो कुछ और हो सकता है, तो इसे quote करें। - Colon-space भूल जाना।
key:valueलिखने से पार्स एरर होगा। colon के बाद एक space होना चाहिए:key: value। यह एक छोटा सा विवरण है जो हर किसी को कम से कम एक बार फंसाता है। - असंगत indentation। नेस्टिंग के एक स्तर के लिए दो spaces का उपयोग करना और फिर दूसरे के लिए चार का उपयोग करना पार्सर को भ्रमित कर देगा। एक indentation चौड़ाई चुनें (2 spaces सबसे आम convention है) और उस पर टिके रहें।
- Multi-line string का भ्रम। YAML में multi-line strings को संभालने के लिए विशेष वर्ण (
|और>) होते हैं।|नई लाइनों को संरक्षित करता है (कोड स्निपेट के लिए बढ़िया), जबकि>उन्हें एक ही लाइन में मोड़ देता है (लंबे पैराग्राफ के लिए बढ़िया)। गलत का उपयोग करने से आपका टेक्स्ट खराब हो सकता है।
यह आपके radar पर क्यों होना चाहिए
यदि आप आधुनिक software development में काम करते हैं, विशेष रूप से DevOps और infrastructure के क्षेत्र में, तो आप YAML से बच नहीं सकते।
- Configuration ही राजा है: Docker Compose, Kubernetes, Ansible, और लगभग सभी CI/CD प्लेटफॉर्म (GitHub Actions, GitLab CI) जैसे उपकरण YAML को अपनी प्राथमिक कॉन्फ़िगरेशन भाषा के रूप में उपयोग करते हैं। इसे जानना वैकल्पिक नहीं है; यह एक मुख्य योग्यता है।
- मानव-केंद्रित डेटा: जब भी आप एक ऐसा सिस्टम बना रहे होते हैं जहाँ इंसानों को सीधे structured data लिखने या संपादित करने की आवश्यकता होती है - application settings से लेकर ब्लॉग पोस्ट मेटाडेटा तक - YAML एक शीर्ष उम्मीदवार होना चाहिए।
- JSON का Superset: क्योंकि YAML (ज्यादातर) JSON का एक superset है, आपके पास एक स्पष्ट migration पथ और उत्कृष्ट अंतर-संचालनीयता है। आप एक उलझी हुई JSON file ले सकते हैं, इसे और अधिक पठनीय बनाने के लिए YAML में परिवर्तित कर सकते हैं, comments जोड़ सकते हैं, और फिर इसे वापस परिवर्तित कर सकते हैं यदि किसी अन्य सिस्टम को शुद्ध JSON की आवश्यकता हो।
YAML को JSON के raw, कुशल data stream के मुकाबले एक दोस्ताना, संगठित लाइब्रेरियन जैसा समझें। आपको अपनी टूलकिट में दोनों की आवश्यकता है।
और गहराई में जाएं
- YAML.org: YAML का आधिकारिक घर, जिसमें पूर्ण विनिर्देश शामिल है।
- Wikipedia: YAML: भाषा के इतिहास, विशेषताओं और संस्करणों का एक शानदार उच्च-स्तरीय अवलोकन।
- "YAML Ain't Markup Language" on C2 Wiki: शुरुआती दिनों से व्युत्पत्ति और डिजाइन दर्शन में गोता लगाएँ।
- Ansible's "YAML Syntax" Guide: एक उपकरण से YAML सिंटैक्स के लिए एक व्यावहारिक, वास्तविक दुनिया की गाइड जो इस पर बहुत अधिक निर्भर करती है।
- "Learn YAML in Y minutes": सिंटैक्स के साथ गति पकड़ने के लिए एक शानदार, तेज-तर्रार चीट शीट।