Orijinal YAML
Değiştirilmiş YAML

YAML diff: iki YAML dosyasını çevrimiçi karşılaştırın

İki YAML belgesini yapıştırın ve hassas yan yana bir diff alın. Kubernetes manifestleri, GitHub Actions workflow dosyaları, Helm values ve docker-compose dosyaları için tasarlandı.

YAML diff aracı nedir?

İki YAML belgesini karşılaştırmak için tarayıcıda çalışan ücretsiz bir araç. Eski sürümü sola, yenisini sağa yapıştırın, farklar karakter karakter vurgulansın. Metin tarayıcınızdan çıkmaz; bu, secret referansları veya iç hostname içeren manifestleri diff yaparken önemlidir.

Diff karakter düzeyinde çalışır, metin diff aracımızla aynı motoru kullanır. Editördeki YAML modu sözdizimi vurgulamayı YAML 1.2.2 spesifikasyonuna göre yapar, böylece block scalars, anchors ve flow collections doğru renklenir.

Bir pull request içinde 400 satırlık bir Helm values.yaml diff ekranına bakıp chart yapısını bozan tek girinti kaymasını arayanlardansanız, bu araç onu saniyeler içinde bulur. Slack ile editörünüz arasında kopyala yapıştır yaparken boşlukların tab karakterine dönüştüğü durumlarda da işe yarar; YAML tab kabul etmez.

YAML diff aslında nasıl çalışır

Diff karakter düzeyinde çalışır, ardından bir semantik temizleme adımı vurguları dağılan tek karakterler yerine anlamlı parçalar halinde gruplar. Eklemeler sağ panelde yeşil, silmeler solda kırmızı görünür ve her başlıktaki satır sayıları diff aracının bulduğu farklı düzenleme sayısını söyler.

YAML, formatı bağışlayıcı sananlara dişlerini gösteren ayrıştırma kuralları içerir. YAML 1.2.2 spec belgesine göre girinti yapısaldır; yanlış yerleştirilmiş tek bir boşluk belge ağacını değiştirir. Tab girinti olarak yasaktır ve ayrıştırıcı bunu doğrudan reddeder. Implicit typing, YAML 1.1 sürümünde tırnaksız NO tokenını boolean false değerine çevirir; ünlü Norway problem: ülke kodu listeleri sessizce Norveç değerini kaybeder. YAML 1.2 kuralları daralttı; yalnızca true, false, null ve sayısal biçimler tırnaksız dönüşür, ama hâlâ pek çok araç 1.1 ile ayrıştırıyor.

YAML belgenizi aşağı yönlü bir tüketici için zaten JSON biçimine çevirdiyseniz, JSON diff aracımız anahtar sırası ve canonicalisation gibi yapısal konularla ilgilenir. JSON, YAML 1.2 sürümünün sıkı bir alt kümesidir; geçerli her JSON belgesi geçerli YAML belgesidir. Bu uyum spec belgesinde tanımlıdır ve hem js-yaml hem de libyaml kütüphanelerinin JSON belgesini sürpriz olmadan round-trip yapabilmesinin nedenidir.

Üç adımda YAML karşılaştırma

İki metin paneli, bir diff. Kayıt yok, yükleme yok, sunucuya gidiş geliş yok.

  1. 1

    YAML belgenizi yapıştırın veya yükleyin

    Eski YAML içeriğini sola, yenisini sağa yapıştırın. Veya iki taraftan birinde Yükle düğmesine tıklayarak .yaml ya da .yml dosyasını doğrudan açın. Örnek düğmesi her iki paneli küçük bir Kubernetes Deployment ile doldurur, böylece aracı önce iş başında görebilirsiniz.

  2. 2

    Girintinin niyetinize uyduğunu kontrol edin

    YAML girinti için yalnızca boşluk kullanır, tab kullanmaz. Boşlukları tab karakterine çeviren bir sohbet istemcisinden veya terminalden yapıştırdıysanız ayrıştırıcı dosyayı reddeder. Editör tab karakterlerini ve satır sonu boşluklarını vurgular, böylece bir deploy sürecini devirmeden önce fark edebilirsiniz.

  3. 3

    Diff sonucunu okuyun

    Silmeler solda kırmızı, eklemeler sağda yeşil görünür. İki panel birlikte kayar, böylece uzun manifest dosyalarını yerinizi kaybetmeden takip edebilirsiniz. Her başlıktaki değişiklik sayıları diff aracının bulduğu farklı düzenlemelerin özetidir.

YAML diff aracının doğru seçim olduğu durumlar

Staging ve prod arasında Kubernetes Deployment specs karşılaştırma

Her iki cluster içinde kubectl get deployment web -o yaml komutunu çalıştırın ve çıktıları diff yapın. Çoğu zaman prod hâlâ replicas: 2 ve eski bir image tag ile durur, çünkü sprint sonu bir rollout oraya hiç ulaşmamıştır; kubectl apply komutunu yeniden çalıştırmadan önce bunu doğrulamanın en hızlı yolu metin diff aracıdır. Kubernetes nesne modeli baştan sona YAML kullanır, dolayısıyla bu günlük durumdur.

GitHub Actions workflow YAML dosyalarında diff

Bir branch yeniden adlandırıldıktan sonra workflow tetiklenmez olduysa veya bir job birden 8 dakika daha uzun sürmeye başladıysa, .github/workflows/ci.yml dosyasını son yeşil commit ile diff yapın. Suçlu çoğu zaman değişmiş bir on: filtresi, actions/setup-node içinde kaldırılmış bir cache: anahtarı ya da matriksten sessizce node-version: "18" (string) değerinden node-version: 18 (sayı) değerine geçen ve type checker uyarısına yol açan bir entry değeridir.

Bir deploy öncesi docker-compose env değişikliklerini gözden geçirme

docker-compose.yml dosyasını main daldaki sürümüne karşı diff yaparak gerçekten hangi environment: girişlerini değiştirdiğinizi doğrulayın. İnsanlar yeni env değişkenlerinin bir listesini yapıştırır ve birinin başka bir service altında zaten ayarlandığını unutur; sonra override başka bir yerde sessizce bir flag değerini tersine çevirir. Diff bunu apaçık gösterir.

Helm chart values.yaml dosyasını sürümler arasında izleme

Bir chart sürümünü 1.8.0 değerinden 2.0.0 değerine yükseltirken values.yaml dosyanızı maintainer kişinin yayımladığı yeni varsayılanlara karşı diff yapın. Helm değerleri anahtar anahtar merge eder; yeniden adlandırılmış bir üst düzey anahtar (image.tag alanının image.repository altına taşınması) sessizce chart varsayılanına düşer. Diff, helm upgrade komutu bir regression yaymadan önce bu adlandırma değişikliğini gün yüzüne çıkarır.

OpenAPI ve Swagger YAML schema review

Bir kod üreticisi paths alanını alfabetik sıralarken 3.000 satırlık bir openapi.yaml diff ekranı okunmaz hale gelir. Sürümleri yan yana karşılaştırın ve gerçek değişiklik su yüzüne çıksın: bir request schema içine eklenmiş bir required alanı veya tipi sessizce string değerinden integer değerine geçmiş bir response. Build sürecinin neden bozulduğunu bulmak için üretilmiş bir SDK içini eşelemekten kolay.

Ortamlar arası Ansible playbook diff

Bir playbook dev ortamında çalışıp prod ortamında hata veriyorsa, ikisi arasında inventory veya role içinde defaults/main.yml dosyasını diff yapın. Yaygın neden, hiç kopyalanmamış bir hostvar veya dev ortamında role üzerinde, prod ortamında ise tek bir task üzerinde ayarlanmış bir become: yes değeridir. Diff bunu saniyeler içinde bulur.

YAML hızlı referansı

Bu aracın en sık ortaya çıkardığı ayrıştırma uç durumları için kısa bir kopya kâğıdı. Hepsi YAML spesifikasyonuna ve gerçek ayrıştırıcı davranışına dayanır.

TopicWhat this tool does
GirintiYalnızca boşluk, ve sayı yapısaldır. İki ve dört boşluk yaygındır; dosya başına birini seç ve ona sadık kal. Tarihçeyi merak ediyorsanız Wikipedia üzerindeki YAML genel bakışı iyi bir özettir.
TabSpec belgesine göre girinti olarak yasak. Skaler değerlerin içinde izinli. Editörünüz Enter tuşunda bir tab ekliyorsa, .yaml ve .yml dosyaları için boşluk kullanacak şekilde ayarlayın.
Anchors ve aliases&name bir anchor tanımlar; *name ona referans verir. Container env değişkenleri veya varsayılan service config gibi büyük blokları kopyala yapıştır olmadan tekrar etmek için kullanışlıdır.
Merge keys<<: *base referans verilen mapping yapısını mevcut olana merge eder. Bir YAML 1.1 özelliği. libyaml dahil çoğu ayrıştırıcı hâlâ kabul ediyor; YAML 1.2 spec belgesi bunu kaldırdı.
Çok belgeli dosyalarÜç tire (---) tek bir akıştaki belgeleri ayırır. Birden çok Kubernetes nesnesini tek bir kubectl apply -f komutundan geçirmek için kullanışlıdır. ... bir belgeyi sonlandırır.
Block scalars| satır sonlarını korur (literal); > onları boşlukla katlar. Düzenleyiciler - ve + son satır sonlarını kontrol eder. Shell script dosyaları için |, uzun insan metinleri için > kullanın.
Norway problemTırnaksız NO, YES, ON, OFF değerleri YAML 1.1 sürümünde boolean olur. Tırnak içine al ya da 1.2 ayrıştırıcı kullan. Hangi string değerlerinin dönüştüğü için YAML tip tanımlarına bak.
KodlamaYAML 1.2 spec belgesi UTF-8 gerektirir. UTF-16, BOM ile birlikte izinlidir. Pratikte araçlar BOM bulunmayan UTF-8 bekler, dolayısıyla sürprizleri önlemek için dosyaları öyle kaydedin.

YAML diff: sıkça sorulan sorular

YAML'ın boşluğa duyarlılığı diff için yararlı mı yoksa zararlı mı?

YAML boşluğa duyarlıdır, dolayısıyla normal bir metin diff aracı bile zaten faydalıdır: her girinti değişikliği yapısal bir değişikliktir ve diff onu yakalar. Fark sunumdadır. YAML modu anchors, tags, block scalars ve flow collections değerlerini sözdizimi renkleriyle vurgular, böylece bir değişikliğin bir anahtara mı, string değere mi yoksa liste öğesine mi yapıldığını bir bakışta görürsünüz. Altta yatan diff algoritması metin diff aracımızla aynıdır.

YAML neden girinti ve boşluklar konusunda bu kadar titiz?

Çünkü hangi anahtarın hangi mapping yapısına ait olduğunu ayrıştırıcıya söyleyen tek şey girintidir. YAML 1.2.2 spec belgesi bir node girinti seviyesini başlangıçtaki boşluk sayısıyla tanımlar ve girinti olarak tab kullanımını yasaklar. Tek bir fazladan boşluk bir anahtarı bir alt mapping içine terfi ettirir. Bu katılık, küme parantezi ve virgül gerektirmeyen bir formatın bedelidir; girinti hatalarının JSON yerine YAML içinde daha sık görülmesinin sebebidir.

Norway problem nedir?

YAML 1.1 implicit typing tırnaksız NO tokenını boolean false değerine çevirir. Yani Norveç için NO içeren ülke kodları listesi, sessizce bir girişi false ile değiştirilmiş bir liste hâline gelir. YES, ON, OFF ve benzerleri için de aynısı geçerli. StrictYAML bunu ayrıntılı belgeler. Çözüm: değeri tırnak içine al ("NO") veya YAML 1.2 sürümünü izleyen bir ayrıştırıcı kullan; o yalnızca true, false ve null değerlerini dolaylı dönüştürür.

Anchors, aliases ve merge keys nasıl çalışır?

Bir anchor (&name) bir node işaretler, böylece sonra bir alias (*name) ile referans verebilir, uzun dosyalardaki tekrarı önlersiniz. Merge key (<<: *name) YAML 1.1 sürümünün bir uzantısıydı; referans verilen mapping içindeki tüm anahtarları mevcuda kopyalar, ortak konfigürasyonu service yapıları arasında paylaşmak için kullanışlıdır. Merge key tanımları YAML 1.2 sürümünün parçası değildir; yine de js-yaml dahil çoğu ayrıştırıcı uyumluluk için bunları desteklemeye devam eder. Diff anchors ve aliases değerlerini düz metin gibi ele alır, dolayısıyla yeniden adlandırılmış bir anchor temiz bir biçimde görünür.

YAML diff aracına JSON yapıştırabilir miyim?

Evet. JSON, YAML 1.2 sürümünün sıkı bir alt kümesidir; geçerli her JSON belgesi aynı zamanda geçerli bir YAML belgesidir. Gerçekten istiyorsanız ikisini karıştırabilir, blok stilindeki bir dosyaya JSON stilinde bir flow collection bırakabilirsiniz. Saf JSON çalışmaları için JSON diff aracımızda JSON için hazırlanmış format ve doğrulama düğmeleri vardır; pretty-print ve sort-keys de buna dahil.

Tab kullandığımda ayrıştırıcı dosyamı neden reddediyor?

Çünkü YAML spec belgesi girinti olarak tab kullanımını yasaklar. 1.2.2 spec belgesinden alıntı: "To maintain portability, tab characters must not be used in indentation." Tab karakterleri skaler değerlerin içinde izinlidir (bir string tab içerebilir), yalnızca girintinin ölçüldüğü satır başında değil. Çözüm, dosyanızın hâlihazırda izlediği kurala göre tab karakterinden iki ya da dört boşluğa hızlı bir bul değiştir.

Gizlilik ve nasıl çalıştığı

YAML belgeniz tarayıcınızdan çıkmaz. Editör, sözdizimi vurgulayıcı ve diff aracının tamamı makinenizde, yerelde çalışır. Girdinize ilişkin analiz yok, log yok, bulut gidiş geliş yok. İzlediğimiz biçim YAML 1.2.2 spesifikasyonudur. Hiçbir şeyin yüklenmediğini doğrulamak için karşılaştırma sırasında DevTools açın ve Network sekmesini izleyin.