YAML Nedir?

YAML, YAML Ain’t Markup Language, hem insan tarafından kolaylıkla okunabilen hemde sayısal olarak kolaylıkla işleme alınabilen ve tüm programlama dilleri tarafından kullanılabilen bir veri değişim formatıdır.

AA

Temel amacı oldukça kompleks bir yapı sunan XML‘e basitleştirilmiş bir alternatif sunabilmek olan YAML ile ilgili gelişmeler ve desteklenen programlama dilleriyle ilgili yaml.org adresi takip edilebilir. Bu özellikleri bir liste haline getirecek olursak;

  • Kolay okunabilir,
  • Farklı programlama dilleri arasında veri taşıma amacıyla ortak bir şekilde kullanılabilir,
  • Tutarlı bir modele sahiptir,
  • Esnek ve geliştirilebilir bir yapı sunar,
  • Uygulaması, entegre etmesi ve kullanması kolaydır.

Daha fazla bilgi ve detaylı bir değerlendirme için Martin Tournoij1 tarafından paylaşılan YAML: probably not so great after all2 başlıklı yazıya ve Reddit tartışmasına3 göz atmanızı öneririm. Tüm diller tarafından ortak bir şekilde kullanılabilen yapısı sayesinde nesne yapılarının temsilinin yanı sıra konfigürasyon amaçlı da kullanılmaktadır. JSON Nedir? başlıklı yazıda JSON ve XML yapılarına değinmiştim. Aynı XML örneğini YAML ile oluşturulmuş şekilde aşağıda ayrıca iletiyorum.

<?xml version="1.0" encoding="UTF-8" ?>
<root>
  <name>Charles</name>
  <surname>Freck</surname>
  <age>31</age>
  <address>
    <city>Anaheim</city>
    <county>Orange County</county>
    <state>California</state>
    <coordinates>
      <ID>
        <row>33</row>
        <row>50</row>
        <row>7.0548</row>
        <row>N</row>
      </ID>
      <ID>
        <row>117</row>
        <row>54</row>
        <row>52.218</row>
        <row>W</row>
      </ID>
    </coordinates>
  </address>
  <contact>
    <type>telephone</type>
    <number>25052006</number>
  </form/contact>
  <contact>
    <type>e-mail</type>
    <name>ascanner@darkly.com</name>
  </form/contact>
  <contact>
    <type>
      <account>facebook</account>
      <url>https://facebook.com/charles.freck</url>
      <official>0</official>
    </type>
    <type>
      <account>twitter</account>
      <url>https://twitter.com/charles.freck</url>
      <official>1</official>
    </type>
    <type>
      <account>instagram</account>
      <url>https://instagram.com/charles.freck</url>
      <official>0</official>
    </type>
    <type>
      <account>linkedin</account>
      <url/>
      <official/>
    </type>
  </form/contact>
</root>

XML içeriği okumanın zorluğunu ve katı kuralları sebebiyle esnetilmesindeki güçlüklerden tekrar detaylıca bahsetmeye gerek yok. Aşağıda, bu yapının JSON formatındaki karşılığına baktığımızda daha kolay okunabildiğini ve esnek bir şekilde kullanılabildiğini görebilmekteyiz.

{
 "root": {
  "name": "Charles",
  "surname": "Freck",
  "age": "31",
  "address": {
   "city": "Anaheim",
   "county": "Orange County",
   "state": "California",
   "coordinates": {
    "ID": [
     {
      "row": [
       "33",
       "50",
       "7.0548",
       "N"
      ]
     },
     {
      "row": [
       "117",
       "54",
       "52.218",
       "W"
      ]
     }
    ]
   }
  },
  "contact": [
   {
    "type": "telephone",
    "number": "25052006"
   },
   {
    "type": "e-mail",
    "name": "ascanner@darkly.com"
   },
   {
    "type": [
     {
      "account": "facebook",
      "url": "https://facebook.com/charles.freck",
      "official": "0"
     },
     {
      "account": "twitter",
      "url": "https://twitter.com/charles.freck",
      "official": "1"
     },
     {
      "account": "instagram",
      "url": "https://instagram.com/charles.freck",
      "official": "0"
     },
     {
      "account": "linkedin",
      "url": "",
      "official": ""
     }
    ]
   }
  ]
 }
}

JSON ile YAML karşılaştırmasını yaptığımızda ise ilk dikkatimizi çeken konu JSON formatında sıklıkla yer bulan süslü ve köşeli parantez {}, [] kullanımları olacaktır. Bunun yerine YAML boşlukları, çizgi ve bazı diğer karakterleri kullanır. Yapı (structure) girintiyle (bir veya daha fazla boşluk), sıra öğeleri (sequence) bir çizgi - ve map kapsamındaki anahtar değer (key value) üst üste iki nokta : ile ayrılır; key (anahtar): value (değer). Referans tanımlamalardan bazılarını (YAML 1.1+ için) listeleyecek olursak;

Göstergeler Koleksiyonu:
    '? ' : Anahtar (key) gösterge.
    ': ' : Değer (value) gösterge.
    '- ' : İç içe seri giriş göstergesi.
    ', ' : Ayrı satır içi Separate in-line dal ayrıştırıcı.
    '[]' : Satır içi seri kapsayıcı.
    '{}' : Satır içi ifade kapsayıcı.

Ad Tanımlama Koleksiyonu:
    '&'  : Çapa tanımı.
    '\*'  : Takma ad göstergesi.

Referans gösterge koleksiyonlarının tamamını YAML > Reference card sayfası üzerinden görüntüleyebilir, How To Write YAML4 ve Complete idiot’s introduction to yaml5 ile yazım konusundaki örnekleri inceleyebilirsiniz.

root:
  address:
    city: Anaheim
    coordinates:
      ID:
        -
          row:
            - 33
            - 50
            - "7.0548"
            - "N"
        -
          row:
            - 117
            - 54
            - "52.218"
            - w
    county: "Orange County"
    state: California
  age: 31
  contact:
    -
      number: 25052006
      type: telephone
    -
      name: ascanner@darkly.com
      type: e-mail
    -
      type:
        -
          account: facebook
          official: 0
          url: "https://facebook.com/charles.freck"
        -
          account: twitter
          official: 1
          url: "https://twitter.com/charles.freck"
        -
          account: instagram
          official: 0
          url: "https://instagram.com/charles.freck"
        -
          account: linkedin
          official: ""
          url: ""
  name: Charles
  surname: Freck

Hatırlarsanız, WP-CLI konfigürasyon işlemleri için de *.yml (YAML) dosyalarına müdahale etmiştik. Benzer şekilde daha pek çok uygulama ve servis bağlamında YAML dosyalarıyla haşır neşir olmaktayız; Docker Compose ve Symfony2 konfigürasyon süreçlerini de örnek olarak gösterebiliriz.