Ursprunglig YAML
Ändrad YAML

YAML-diff: jämför två YAML-filer online

Klistra in två YAML-dokument och få en exakt diff sida vid sida. Byggt för Kubernetes-manifest, GitHub Actions-workflows, Helm values och docker-compose-filer.

Vad är YAML-diff-verktyget?

Ett gratis verktyg i webbläsaren för att jämföra två YAML-dokument. Klistra in den gamla versionen till vänster, den nya till höger, så markeras skillnaderna tecken för tecken. Texten lämnar aldrig din webbläsare, vilket spelar roll när du diffar manifest med referenser till secrets eller interna hostnames.

Diffen körs på teckennivå, samma motor som vårt textdiff-verktyg använder. Editorns YAML-läge sköter syntaxmarkering enligt YAML 1.2.2-specifikationen, så block scalars, anchors och flow collections får rätt färger.

Har du någonsin stirrat på en diff på 400 rader i en Helm values.yaml i en pull request och letat efter den enda indragsmissen som knäckte chartet, så är detta verktyget som hittar den på sekunder. Det är också användbart när copy-paste mellan Slack och din editor förvandlar mellanslag till tabbar, vilket YAML vägrar acceptera.

Hur YAML-diffen faktiskt fungerar

Diffen körs på teckennivå, sedan grupperar en semantisk städningsomgång markeringarna i meningsfulla block i stället för utspridda enstaka tecken. Tillägg visas i grönt i den högra rutan, borttagningar i rött till vänster, och räknarna i varje rubrik säger hur många distinkta ändringar diffen hittade.

YAML har parsningsregler som biter den som behandlar formatet som förlåtande. Indrag är strukturellt enligt YAML 1.2.2-spec, så ett enda felplacerat mellanslag ändrar dokumentträdet. Tabbar är förbjudna som indrag och parsern avvisar dem rakt av. Implicit typing gör i YAML 1.1 om det ociterade tokenet NO till booleanen false, det berömda Norway problem: listor med landskoder förlorar Norge i tystnad. YAML 1.2 stramade åt reglerna så att bara true, false, null och numeriska former konverteras utan citationstecken, men många verktyg parsar fortfarande 1.1.

Har du redan konverterat din YAML till JSON för en konsument nedströms tar vårt JSON-diff-verktyg hand om strukturella frågor som nyckelordning och kanonikalisering. JSON är en strikt delmängd av YAML 1.2, så varje giltigt JSON-dokument är också giltig YAML: den kompatibiliteten är dokumenterad i spec och är skälet till att js-yaml och libyaml båda kan round-trippa JSON utan överraskningar.

Så jämför du YAML i tre steg

Två textrutor, en diff. Ingen registrering, ingen uppladdning, ingen serverresa.

  1. 1

    Klistra in eller ladda upp din YAML

    Klistra in den gamla YAML-filen till vänster, den nya till höger. Eller klicka på Ladda upp på endera sidan för att läsa in en .yaml- eller .yml-fil direkt. Exempel-knappen fyller båda rutorna med ett litet Kubernetes-Deployment, så att du först ser verktyget i arbete.

  2. 2

    Kontrollera att indraget stämmer med din avsikt

    YAML använder bara mellanslag för indrag, aldrig tabbar. Har du klistrat in från en chattklient eller terminal som omvandlat mellanslag till tabbar avvisar parsern filen. Editorn markerar tabbar och blanksteg i radslut så att du upptäcker dem innan de fäller en deploy.

  3. 3

    Läs diffen

    Borttagningar visas i rött till vänster, tillägg i grönt till höger. Båda rutorna scrollar i takt så att du kan följa långa manifest utan att tappa platsen. Ändringsräknarna i rubrikerna sammanfattar hur många distinkta redigeringar diffen hittade.

När YAML-diff är rätt verktyg

Jämföra Kubernetes Deployment-specs mellan staging och prod

Kör kubectl get deployment web -o yaml i båda klustren och diffa utdata. Ofta står prod kvar med replicas: 2 och en gammal image-tag eftersom en utrullning i sprintens slut aldrig nådde dit, och en textdiff är snabbaste sättet att bekräfta det innan du kör kubectl apply igen. Kubernetes objektmodell är YAML rakt igenom, så det är vardagsfallet.

Diffa GitHub Actions-workflow-YAML

När en workflow slutar trigga efter ett branchnamnbyte eller ett job plötsligt tar 8 minuter längre, diffa .github/workflows/ci.yml mot senaste gröna commit. Boven brukar vara ett ändrat on:-filter, en borttagen cache:-nyckel i actions/setup-node, eller en matrix-post som tyst gick från node-version: "18" (sträng) till node-version: 18 (siffra) och stötte på type checkern.

Granska docker-compose-env-ändringar inför en deploy

Diffa docker-compose.yml mot versionen i main för att verifiera vilka environment:-poster du faktiskt ändrade. Folk klistrar in en lista nya env-variabler och glömmer att en av dem redan var satt under en annan service, så overriden vänder tyst på en flagga någon annanstans. Diffen gör det uppenbart.

Följa values.yaml för en Helm-chart över releaser

Vid uppgradering av en chart från 1.8.0 till 2.0.0, diffa din values.yaml mot de nya defaults som maintainern publicerat. Helm mergar värden nyckel för nyckel, så en omdöpt toppnivånyckel (image.tag som flyttar in under image.repository) faller tyst tillbaka till chartens default. Diffen lyfter fram namnändringen innan helm upgrade rullar ut en regression.

Granska OpenAPI- och Swagger-YAML-scheman

En diff av en 3 000 rader lång openapi.yaml är oläslig när en kodgenerator sorterar om paths alfabetiskt. Lägg versionerna sida vid sida och den faktiska ändringen kommer fram: ett required-fält tillagt till ett request-schema, eller ett response vars typ tyst gick från string till integer. Lättare än att gräva i en genererad SDK för att hitta varför bygget gick sönder.

Ansible-playbook-diff mellan miljöer

När en playbook fungerar i dev men kraschar i prod, diffa inventory eller rollens defaults/main.yml mellan de två. En vanlig orsak är en hostvar som aldrig kopierats över, eller ett become: yes som var satt på rollen i dev men på en enskild task i prod. Diffen hittar det på sekunder.

YAML snabbreferens

En kort fusklapp för parsnings-gränsfallen som det här verktyget oftast plockar fram. Allt grundat i YAML-specifikationen och verkligt parserbeteende.

TopicWhat this tool does
IndragBara mellanslag, och antalet är strukturellt. Två och fyra mellanslag är båda vanliga; välj en variant per fil och håll dig till den. YAML-översikten på Wikipedia har en bra sammanfattning om du vill ha historiken.
TabbarFörbjudna som indrag enligt spec. Tillåtna inuti skalärvärden. Stoppar din editor in en tab på Enter, ställ om den för att använda mellanslag i .yaml- och .yml-filer.
Anchors och aliases&name definierar en anchor; *name refererar den. Praktiskt för att upprepa stora block som container-env-variabler eller default-service-config utan copy-paste.
Merge keys<<: *base mergar den refererade mappingen in i den nuvarande. En YAML 1.1-funktion. De flesta parsers, inklusive libyaml, accepterar den fortfarande; YAML 1.2-spec slopade den.
Filer med flera dokumentTre bindestreck (---) skiljer dokument i en och samma ström. Användbart för att skicka flera Kubernetes-objekt genom ett enda kubectl apply -f. ... avslutar ett dokument.
Block scalars| bevarar radbrytningar (literal); > viker dem till mellanslag. Modifierarna - och + styr avslutande radbrytningar. Använd | för shell-skript, > för lång prosa.
Norway problemOciterade NO, YES, ON, OFF blir booleans i YAML 1.1. Citera dem eller använd en 1.2-parser. Se YAML-typdefinitionerna för vilka strängar som konverteras.
KodningYAML 1.2-spec kräver UTF-8. UTF-16 är tillåtet med BOM. I praktiken förväntar sig verktyg UTF-8 utan BOM, så spara filerna så för att slippa överraskningar.

YAML-diff: vanliga frågor

Hjälper eller stjälper YAML:s blankstegskänslighet diffen?

YAML är blankstegskänsligt, så en vanlig textdiff är redan användbar: varje indragsändring är en strukturell ändring och diffen fångar den. Skillnaden ligger i presentationen. YAML-läget färgar anchors, tags, block scalars och flow collections med syntaxfärger så att du på en blick ser om en ändring gäller en nyckel, ett strängvärde eller ett listobjekt. Diff-algoritmen under huven är densamma som i vårt textdiff-verktyg.

Varför är YAML så petigt med indrag och mellanslag?

För att indraget är det enda som talar om för parsern vilka nycklar som hör till vilken mapping. YAML 1.2.2-spec definierar en nods indragsnivå med antalet inledande mellanslag och förbjuder tabbar som indrag. Ett enda extra mellanslag flyttar upp en nyckel i en sub-mapping. Den stränghet är priset för ett format som inte behöver klamrar och kommatecken, och förklaringen till att indragsbuggar syns oftare i YAML än i JSON.

Vad är Norway problem?

Implicit typing i YAML 1.1 gör om det ociterade tokenet NO till booleanen false. Så en lista med landskoder som innehåller NO för Norge blir tyst en lista där en post bytts ut mot false. Samma sak gäller YES, ON, OFF och liknande. StrictYAML beskriver det i detalj. Lösningen är att citera värdet ("NO") eller använda en parser som följer YAML 1.2 och bara konverterar true, false och null implicit.

Hur fungerar anchors, aliases och merge keys?

En anchor (&name) markerar en nod så att du senare kan referera till den med ett alias (*name) och slipper upprepningar i långa filer. Merge key (<<: *name) var en YAML 1.1-utökning som kopierar alla nycklar från den refererade mappingen in i den nuvarande, användbart för att dela gemensam config mellan services. Merge keys är inte del av YAML 1.2, men de flesta parsers, inklusive js-yaml, accepterar dem fortfarande för bakåtkompatibilitet. Diffen behandlar anchors och aliases som vanlig text, så en omdöpt anchor syns rent.

Kan jag klistra in JSON i YAML-diff-verktyget?

Ja. JSON är en strikt delmängd av YAML 1.2, så varje giltigt JSON-dokument är också ett giltigt YAML-dokument. Du kan blanda de två om du verkligen vill, och släppa in en flow collection i JSON-stil i en fil i blockstil. För rent JSON-arbete har vårt JSON-diff-verktyg formaterings- och valideringsknappar som är JSON-medvetna, inklusive pretty-print och sort-keys.

Varför avvisar parsern min fil när jag använder tabbar?

För att YAML-spec förbjuder tabbar som indrag. Ur 1.2.2-spec: "To maintain portability, tab characters must not be used in indentation." Tabbar är tillåtna inuti skalärvärden (en sträng får innehålla en tab), bara inte i början av en rad där indraget mäts. Lösningen är ett snabbt sök-och-ersätt från tab till två eller fyra mellanslag, beroende på vilken konvention din fil redan använder.

Sekretess och hur det fungerar

Din YAML lämnar inte din webbläsare. Editor, syntaxmarkerare och diff körs alla på din maskin, lokalt. Ingen analytics på din inmatning, inga loggar, ingen molnresa. Formatet vi följer är YAML 1.2.2-specifikationen. För att verifiera att inget laddas upp, öppna DevTools och håll koll på Network-fliken medan du jämför.