YAML-Diff: Zwei YAML-Dateien online vergleichen
Zwei YAML-Dokumente einfügen und einen genauen Diff nebeneinander erhalten. Gemacht für Kubernetes-Manifests, GitHub-Actions-Workflows, Helm-Values und docker-compose-Dateien.
Was ist das YAML-Diff-Tool?
Ein kostenloses Tool im Browser, um zwei YAML-Dokumente zu vergleichen. Alte Version links einfügen, neue rechts, und die Unterschiede werden Zeichen für Zeichen hervorgehoben. Der Text verlässt Ihren Browser nicht, was wichtig ist, wenn Sie Manifests vergleichen, die Verweise auf Secrets oder interne Hostnamen enthalten.
Der Diff arbeitet auf Zeichenebene, mit derselben Engine wie unser Text-Diff-Tool. Der YAML-Modus des Editors übernimmt das Syntax-Highlighting gemäß der YAML-1.2.2-Spezifikation, sodass Block Scalars, Anchors und Flow Collections korrekt eingefärbt sind.
Wer schon einmal in einem Pull Request einen 400-Zeilen-Diff einer Helm-values.yaml angestarrt und nach dem einen Einrückungsfehler gesucht hat, der den Chart kaputt gemacht hat, findet ihn mit diesem Tool in Sekunden. Praktisch ist es auch, wenn Copy-and-Paste zwischen Slack und Editor Tabs erzeugt, die YAML konsequent ablehnt.
Wie der YAML-Diff tatsächlich arbeitet
Der Diff läuft auf Zeichenebene, danach fasst eine semantische Bereinigung die Hervorhebungen zu sinnvollen Blöcken zusammen statt zu verstreuten Einzelzeichen. Einfügungen erscheinen grün im rechten Bereich, Löschungen rot im linken, und die Zähler in jeder Kopfzeile zeigen, wie viele eigenständige Änderungen der Diff gefunden hat.
YAML hat Parsing-Regeln, die zubeißen, wenn man das Format als nachsichtig behandelt. Einrückung ist gemäß der YAML-1.2.2-Spec strukturell, also verändert ein einzelnes verschobenes Leerzeichen den Dokumentbaum. Tabs sind als Einrückung verboten, der Parser weist sie rundheraus zurück. Implicit Typing macht in YAML 1.1 aus dem unquotierten Token NO den Booleschen Wert false, das berühmte Norway problem: Listen mit Ländercodes verlieren stillschweigend Norwegen. YAML 1.2 hat die Regeln verengt, sodass nur noch true, false, null und Zahlenformen ohne Anführungszeichen umgewandelt werden, aber etliche Tools parsen weiterhin nach 1.1.
Wenn Ihr YAML schon für einen nachgelagerten Konsumenten in JSON umgewandelt wurde, kümmert sich unser JSON-Diff-Tool um strukturelle Themen wie Schlüsselreihenfolge und Kanonisierung. JSON ist eine echte Teilmenge von YAML 1.2, also ist jedes gültige JSON-Dokument auch gültiges YAML. Diese Kompatibilität steht in der Spec, und genau deshalb können js-yaml und libyaml JSON ohne Überraschungen round-trippen.
YAML in drei Schritten vergleichen
Zwei Textbereiche, ein Diff. Keine Anmeldung, kein Upload, kein Server-Roundtrip.
- 1
YAML einfügen oder hochladen
Altes YAML links einfügen, neues rechts. Oder klicken Sie auf einer der beiden Seiten auf Hochladen, um eine .yaml- oder .yml-Datei direkt zu laden. Der Beispiel-Button füllt beide Bereiche mit einem kleinen Kubernetes-Deployment, damit Sie das Tool zuerst in Aktion sehen.
- 2
Prüfen, ob die Einrückung Ihrer Absicht entspricht
YAML benutzt zur Einrückung ausschließlich Leerzeichen, niemals Tabs. Wenn Sie aus einem Chat-Client oder einem Terminal eingefügt haben, das Leerzeichen in Tabs umgewandelt hat, lehnt der Parser die Datei ab. Der Editor hebt Tabs und Whitespace am Zeilenende hervor, damit Sie sie bemerken, bevor sie ein Deployment scheitern lassen.
- 3
Den Diff lesen
Löschungen erscheinen links rot, Einfügungen rechts grün. Beide Bereiche scrollen synchron, damit man auch in langen Manifests den Faden nicht verliert. Die Änderungszähler in den Kopfzeilen fassen zusammen, wie viele eigenständige Änderungen der Diff gefunden hat.
Wann der YAML-Diff das richtige Werkzeug ist
Kubernetes-Deployment-Specs zwischen Staging und Prod vergleichen
Führen Sie kubectl get deployment web -o yaml in beiden Clustern aus und diffen Sie die Ausgabe. Oft hat Prod immer noch replicas: 2 und einen alten Image-Tag, weil ein Rollout am Sprintende dort nie angekommen ist. Ein Text-Diff ist der schnellste Weg, das vor einem erneuten kubectl apply zu prüfen. Das Kubernetes-Objektmodell ist durch und durch YAML, daher ist das der Alltagsfall.
GitHub-Actions-Workflow-YAML diffen
Wenn ein Workflow nach einer Branch-Umbenennung nicht mehr ausgelöst wird oder ein Job plötzlich 8 Minuten länger braucht, diffen Sie .github/workflows/ci.yml gegen den letzten grünen Commit. Schuld ist meistens ein geänderter on:-Filter, ein entfernter cache:-Schlüssel in actions/setup-node oder ein Matrix-Eintrag, der unbemerkt von node-version: "18" (String) auf node-version: 18 (Zahl) gewechselt ist und den Type Checker erwischt hat.
docker-compose-env-Änderungen vor einem Deploy prüfen
Diffen Sie docker-compose.yml gegen die Version in main, um zu sehen, welche environment:-Einträge Sie wirklich geändert haben. Leute fügen eine Liste neuer ENV-Variablen ein und vergessen, dass eine davon schon unter einem anderen Service gesetzt war, sodass das Override an anderer Stelle still einen Flag umlegt. Der Diff macht das offensichtlich.
values.yaml eines Helm-Charts über Releases verfolgen
Beim Upgrade eines Charts von 1.8.0 auf 2.0.0 diffen Sie Ihre values.yaml gegen die neuen Defaults, die der Maintainer veröffentlicht hat. Helm merged Values Schlüssel für Schlüssel, also fällt ein umbenannter Top-Level-Key (image.tag, der unter image.repository wandert) still auf den Chart-Default zurück. Der Diff zeigt die Umbenennung, bevor helm upgrade eine Regression ausrollt.
OpenAPI- und Swagger-YAML-Schemas reviewen
Ein Diff einer 3000-Zeilen-openapi.yaml ist unleserlich, wenn ein Codegenerator paths alphabetisch umsortiert. Stellt man die Versionen nebeneinander, taucht die echte Änderung auf: ein required-Feld, das einem Request-Schema hinzugefügt wurde, oder eine Response, deren Typ heimlich von string auf integer gewechselt ist. Einfacher, als ein generiertes SDK durchzuwühlen, um herauszufinden, warum die Build kaputt ging.
Ansible-Playbook-Diffs zwischen Umgebungen
Wenn ein Playbook in Dev läuft und in Prod scheitert, diffen Sie das Inventory oder die defaults/main.yml der Role zwischen beiden. Häufige Ursache: eine Hostvar, die nie kopiert wurde, oder ein become: yes, das in Dev auf der Role und in Prod auf einer einzelnen Task gesetzt war. Der Diff findet das in Sekunden.
YAML-Kurzreferenz
Ein knapper Spickzettel für die Parsing-Grenzfälle, die dieses Tool am häufigsten zutage bringt. Alles fußt auf der YAML-Spezifikation und realem Parser-Verhalten.
| Topic | What this tool does |
|---|
| Einrückung | Nur Leerzeichen, und die Anzahl ist strukturell. Zwei und vier Leerzeichen sind beide üblich; pro Datei eine Variante wählen und dabei bleiben. Die YAML-Übersicht in Wikipedia ist eine gute Zusammenfassung, falls Sie die Geschichte interessiert. |
|---|
| Tabs | Laut Spec als Einrückung verboten. Innerhalb skalarer Werte erlaubt. Wenn Ihr Editor bei Enter einen Tab einfügt, stellen Sie ihn so ein, dass er für .yaml- und .yml-Dateien Leerzeichen verwendet. |
|---|
| Anchors und Aliases | &name definiert einen Anchor; *name referenziert ihn. Praktisch, um große Blöcke wie Container-ENV-Variablen oder die Default-Service-Konfiguration ohne Copy-and-Paste zu wiederholen. |
|---|
| Merge Keys | <<: *base mergt das referenzierte Mapping ins aktuelle. YAML-1.1-Feature. Die meisten Parser, einschließlich libyaml, akzeptieren es noch; die YAML-1.2-Spec hat es gestrichen. |
|---|
| Multi-Document-Dateien | Drei Bindestriche (---) trennen Dokumente in einem Stream. Praktisch, um mehrere Kubernetes-Objekte durch ein einziges kubectl apply -f zu schicken. ... beendet ein Dokument. |
|---|
| Block Scalars | | behält Zeilenumbrüche (literal); > faltet sie zu Leerzeichen. Die Modifier - und + steuern abschließende Umbrüche. | für Shell-Skripte, > für lange Prosa. |
|---|
| Norway problem | Ohne Anführungszeichen werden NO, YES, ON, OFF in YAML 1.1 zu Booleans. Quoten oder einen 1.2-Parser einsetzen. Welche Strings umgewandelt werden, steht in den YAML-Typ-Definitionen. |
|---|
| Kodierung | Die YAML-1.2-Spec verlangt UTF-8. UTF-16 ist mit BOM erlaubt. In der Praxis erwarten die Tools UTF-8 ohne BOM, also Dateien so speichern, um Überraschungen zu vermeiden. |
|---|
YAML-Diff: häufige Fragen
Hilft oder schadet YAMLs Whitespace-Empfindlichkeit dem Diff?
YAML ist whitespace-sensitiv, ein normaler Text-Diff ist also schon nützlich: Jede Einrückungsänderung ist eine strukturelle Änderung, und der Diff bekommt sie mit. Der Unterschied liegt in der Darstellung. Der YAML-Modus färbt Anchors, Tags, Block Scalars und Flow Collections in Syntax-Farben, sodass auf einen Blick klar ist, ob eine Änderung einen Schlüssel, einen String-Wert oder ein Listen-Element betrifft. Der zugrunde liegende Diff-Algorithmus ist derselbe wie beim Text-Diff-Tool.
Warum ist YAML so pingelig bei Einrückung und Leerzeichen?
Weil die Einrückung das Einzige ist, was dem Parser sagt, welche Schlüssel zu welchem Mapping gehören. Die YAML-1.2.2-Spec definiert die Einrückungstiefe eines Knotens über die Anzahl führender Leerzeichen und verbietet Tabs als Einrückung. Ein einziges zusätzliches Leerzeichen befördert einen Schlüssel in ein Sub-Mapping. Diese Strenge ist der Preis für ein Format ohne geschweifte Klammern und Kommata, und genau deshalb sieht man Einrückungs-Bugs öfter in YAML als in JSON.
Was ist das Norway problem?
Implicit Typing in YAML 1.1 macht aus dem unquotierten Token NO den Booleschen Wert false. Eine Liste mit Ländercodes, die NO für Norwegen enthält, wird so still zur Liste mit einem Eintrag, der durch false ersetzt ist. Dasselbe gilt für YES, ON, OFF und Konsorten. StrictYAML beschreibt das im Detail. Die Lösung: den Wert quoten ("NO") oder einen Parser nehmen, der YAML 1.2 folgt, der nur true, false und null implizit umwandelt.
Wie funktionieren Anchors, Aliases und Merge Keys?
Ein Anchor (&name) markiert einen Knoten, sodass man ihn später mit einem Alias (*name) referenzieren kann, was Wiederholungen in langen Dateien vermeidet. Der Merge Key (<<: *name) war eine YAML-1.1-Erweiterung, die alle Schlüssel des referenzierten Mappings ins aktuelle kopiert. Praktisch, um gemeinsame Konfiguration über Services hinweg zu teilen. Merge Keys sind nicht Teil von YAML 1.2, die meisten Parser, einschließlich js-yaml, akzeptieren sie aber weiterhin aus Kompatibilitätsgründen. Der Diff behandelt Anchors und Aliases als Plain Text, also taucht ein umbenannter Anchor sauber auf.
Kann ich JSON in das YAML-Diff-Tool einfügen?
Ja. JSON ist eine echte Teilmenge von YAML 1.2, also ist jedes gültige JSON-Dokument auch ein gültiges YAML-Dokument. Sie können beides mischen, wenn Sie unbedingt wollen, und eine Flow Collection im JSON-Stil in eine Datei im Block-Stil setzen. Für reine JSON-Arbeit hat unser JSON-Diff-Tool Format- und Validate-Buttons, die JSON kennen, samt Pretty-Print und Sort-Keys.
Warum lehnt der Parser meine Datei ab, wenn ich Tabs benutze?
Weil die YAML-Spec Tabs als Einrückung verbietet. Aus der 1.2.2-Spec: "To maintain portability, tab characters must not be used in indentation." Tabs sind innerhalb von skalaren Werten erlaubt (ein String darf einen Tab enthalten), nur nicht am Zeilenanfang, wo die Einrückung gemessen wird. Die Lösung: ein schnelles Suchen-und-Ersetzen von Tab zu zwei oder vier Leerzeichen, je nachdem, was in Ihrer Datei schon Konvention ist.
Datenschutz und wie das funktioniert
Ihr YAML verlässt Ihren Browser nicht. Editor, Syntax-Highlighter und Diff laufen alle auf Ihrem Rechner, lokal. Keine Analytics auf der Eingabe, keine Logs, kein Cloud-Roundtrip. Wir folgen der YAML-1.2.2-Spezifikation. Um zu prüfen, dass nichts hochgeladen wird, öffnen Sie die DevTools und schauen beim Vergleichen in den Network-Tab.