Oryginalny YAML
Zmieniony YAML

Diff YAML: porównaj dwa pliki YAML online

Wklej dwa dokumenty YAML i otrzymaj precyzyjny diff obok siebie. Z myślą o manifestach Kubernetes, workflowach GitHub Actions, values Helm i plikach docker-compose.

Czym jest narzędzie diff YAML?

Darmowe narzędzie w przeglądarce do porównywania dwóch dokumentów YAML. Wklej starą wersję po lewej, nową po prawej, a różnice zaznaczą się znak po znaku. Tekst nie opuszcza twojej przeglądarki, co liczy się, gdy diffujesz manifesty z odwołaniami do secretów lub wewnętrznych hostname.

Diff działa na poziomie znaku, ten sam silnik, którego używa nasze narzędzie diff tekstu. Tryb YAML w edytorze obsługuje podświetlanie składni zgodnie ze specyfikacją YAML 1.2.2, więc block scalars, anchors i flow collections kolorują się prawidłowo.

Jeśli kiedykolwiek wpatrywałeś się w diff 400 linii Helmowego values.yaml w pull requeście, szukając jednego błędu wcięcia, który zepsuł chart, to jest narzędzie, które znajduje go w sekundy. Przydaje się też wtedy, gdy kopiowanie i wklejanie między Slackiem a edytorem zamienia spacje na taby, których YAML nie akceptuje.

Jak naprawdę działa diff YAML

Diff działa na poziomie znaku, a potem przejście czyszczenia semantycznego grupuje podświetlenia w sensowne bloki, zamiast rozsianych pojedynczych znaków. Wstawienia są zielone w prawym panelu, usunięcia czerwone po lewej, a liczniki w każdym nagłówku mówią, ile odrębnych edycji znalazł diff.

YAML ma reguły parsowania, które gryzą tych, którzy traktują go jak format wyrozumiały. Wcięcie jest strukturalne według spec YAML 1.2.2, więc jedna źle postawiona spacja zmienia drzewo dokumentu. Taby są zakazane jako wcięcie, a parser je odrzuca bezceremonialnie. Implicit typing zamienia w YAML 1.1 niecytowany token NO na boolean false, słynny Norway problem: listy kodów krajów po cichu tracą Norwegię. YAML 1.2 zacieśnił reguły, więc tylko true, false, null i formy liczbowe konwertują się bez cudzysłowów, ale wiele narzędzi nadal parsuje 1.1.

Jeśli już skonwertowałeś YAML do JSON dla konsumenta downstream, nasze narzędzie diff JSON zajmuje się sprawami strukturalnymi, takimi jak kolejność kluczy i kanonikalizacja. JSON jest ścisłym podzbiorem YAML 1.2, więc każdy poprawny dokument JSON jest też poprawnym YAML: ta zgodność jest udokumentowana w specyfikacji i jest powodem, dla którego js-yaml oraz libyaml mogą bez niespodzianek robić round-trip JSON-a.

Jak porównać YAML w trzech krokach

Dwa panele tekstowe, jeden diff. Bez rejestracji, bez wysyłki, bez podróży na serwer.

  1. 1

    Wklej lub wczytaj YAML

    Stary YAML wklej po lewej, nowy po prawej. Albo kliknij Wczytaj po którejś ze stron, by otworzyć plik .yaml lub .yml bezpośrednio. Przycisk Przykład wypełnia oba panele małym Deploymentem Kubernetes, żebyś najpierw zobaczył narzędzie w akcji.

  2. 2

    Sprawdź, czy wcięcia są takie, jak chciałeś

    YAML używa do wcięć tylko spacji, nigdy tabów. Jeśli wkleiłeś z klienta czatu lub terminala, który zamienił spacje na taby, parser odrzuci plik. Edytor podświetla taby i białe znaki na końcu wiersza, byś je zauważył, zanim zwalą deploy.

  3. 3

    Przeczytaj diff

    Usunięcia są na czerwono po lewej, dodania na zielono po prawej. Oba panele przewijają się razem, więc długie manifesty śledzisz bez gubienia miejsca. Liczniki zmian w nagłówkach podsumowują, ile odrębnych edycji znalazł diff.

Kiedy diff YAML to właściwe narzędzie

Porównanie speców Deployment Kubernetes między staging a prod

Uruchom kubectl get deployment web -o yaml w obu klastrach i zdiffuj wyjście. Często prod nadal ma replicas: 2 i stary tag obrazu, bo rollout pod koniec sprintu tam nie dotarł, a diff tekstowy to najszybszy sposób, by potwierdzić to przed ponownym kubectl apply. Model obiektów Kubernetes jest na wskroś YAML-owy, więc to przypadek codzienny.

Diff workflowów YAML GitHub Actions

Gdy workflow przestaje się odpalać po zmianie nazwy brancha albo job nagle trwa 8 minut dłużej, zdiffuj .github/workflows/ci.yml z ostatnim zielonym commitem. Winowajcą zwykle jest zmieniony filtr on:, usunięty klucz cache: w actions/setup-node, albo wpis matrycy, który po cichu przeszedł z node-version: "18" (string) na node-version: 18 (liczba) i wywrócił type checker.

Przegląd zmian env w docker-compose przed deployem

Zdiffuj docker-compose.yml z wersją w main, by sprawdzić, które wpisy environment: faktycznie zmieniłeś. Ludzie wklejają listę nowych zmiennych env i zapominają, że jedna z nich była już ustawiona pod innym service, więc override po cichu przerzuca flagę gdzie indziej. Diff to demaskuje.

Śledzenie values.yaml chartu Helm między releasami

Przy podbijaniu chartu z 1.8.0 do 2.0.0 zdiffuj swoje values.yaml z nowymi domyślnymi wartościami opublikowanymi przez maintainera. Helm merguje wartości klucz po kluczu, więc przemianowany klucz najwyższego poziomu (image.tag przenoszący się pod image.repository) po cichu spada do domyślnej wartości chartu. Diff wyciąga tę zmianę nazwy, zanim helm upgrade rozsieje regresję.

Przegląd schematów YAML OpenAPI i Swagger

Diff 3000-liniowego openapi.yaml jest nieczytelny, gdy generator kodu przesortowuje paths alfabetycznie. Postaw wersje obok siebie i prawdziwa zmiana wychodzi: pole required dodane do schematu requesta, albo response, którego typ po cichu zmienił się ze string na integer. Łatwiej niż grzebać w wygenerowanym SDK, by znaleźć, dlaczego pękła build.

Diff playbooków Ansible między środowiskami

Gdy playbook działa w dev a wywala się w prod, zdiffuj inventory albo defaults/main.yml roli między oboma. Częsta przyczyna to hostvar, który nigdy nie został przekopiowany, albo become: yes ustawione w dev na roli, a w prod na pojedynczym tasku. Diff znajduje to w sekundy.

Szybka ściąga YAML

Krótka ściąga do parserowych przypadków brzegowych, które to narzędzie wyciąga najczęściej. Wszystko zakorzenione w specyfikacji YAML i prawdziwym zachowaniu parserów.

TopicWhat this tool does
WcięcieTylko spacje, a liczba ma znaczenie strukturalne. Dwie i cztery spacje są oba popularne; wybierz jedno na plik i trzymaj się tego. Strona YAML w Wikipedii ma dobre podsumowanie, jeśli chcesz historii.
TabyZakazane jako wcięcie według specu. Dozwolone wewnątrz wartości skalarnych. Jeśli twój edytor wstawia tab po Enterze, ustaw go tak, by używał spacji w plikach .yaml i .yml.
Anchors i aliases&name definiuje anchor; *name się do niego odwołuje. Przydaje się do powtarzania dużych bloków, jak env vars kontenera albo domyślny config service, bez kopiowania.
Merge keys<<: *base merguje wskazany mapping do bieżącego. Funkcja YAML 1.1. Większość parserów, w tym libyaml, nadal je przyjmuje; spec YAML 1.2 je wycofał.
Pliki wielodokumentoweTrzy myślniki (---) rozdzielają dokumenty w jednym strumieniu. Przydaje się, by przepuścić wiele obiektów Kubernetes przez jedno kubectl apply -f. ... kończy dokument.
Block scalars| zachowuje znaki nowej linii (literal); > zwija je w spacje. Modyfikatory - i + kontrolują końcowe znaki nowej linii. Używaj | do skryptów shellowych, > do długiej prozy dla ludzi.
Norway problemNiecytowane NO, YES, ON, OFF stają się booleanami w YAML 1.1. Cytuj je, albo użyj parsera 1.2. Zobacz definicje typów YAML, by sprawdzić, które stringi się konwertują.
KodowanieSpec YAML 1.2 wymaga UTF-8. UTF-16 jest dozwolone z BOM. W praktyce narzędzia oczekują UTF-8 bez BOM, więc zapisuj pliki w ten sposób, żeby uniknąć niespodzianek.

Diff YAML: najczęstsze pytania

Czy wrażliwość YAML na białe znaki pomaga, czy szkodzi diffowi?

YAML jest wrażliwy na białe znaki, więc zwykły diff tekstu już jest pożyteczny: każda zmiana wcięcia jest zmianą strukturalną, a diff ją łapie. Różnica jest w prezentacji. Tryb YAML koloruje anchors, tags, block scalars i flow collections kolorami składni, więc na pierwszy rzut oka widzisz, czy zmiana dotyczy klucza, wartości stringowej, czy elementu listy. Algorytm diffu pod spodem jest taki sam jak w naszym narzędziu diff tekstu.

Dlaczego YAML jest tak wybredny przy wcięciach i spacjach?

Bo wcięcie to jedyne, co mówi parserowi, które klucze należą do którego mappingu. Spec YAML 1.2.2 definiuje poziom wcięcia węzła liczbą wiodących spacji i zakazuje tabów jako wcięć. Jedna dodatkowa spacja awansuje klucz do podmappingu. Ta surowość to cena za format, który nie potrzebuje nawiasów klamrowych ani przecinków, i powód, dla którego błędy wcięć widzi się częściej w YAML niż w JSON.

Czym jest Norway problem?

Implicit typing YAML 1.1 zamienia niecytowany token NO na boolean false. Więc lista kodów krajów zawierająca NO dla Norwegii po cichu staje się listą z jednym wpisem zastąpionym przez false. To samo dotyczy YES, ON, OFF i podobnych. StrictYAML opisuje to szczegółowo. Lekarstwo to ujęcie wartości w cudzysłów ("NO") lub użycie parsera trzymającego się YAML 1.2, który implicytnie konwertuje tylko true, false i null.

Jak działają anchors, aliases i merge keys?

Anchor (&name) oznacza węzeł, byś mógł go potem wskazać aliasem (*name), unikając powtórzeń w długich plikach. Merge key (<<: *name) była rozszerzeniem YAML 1.1, które kopiuje wszystkie klucze ze wskazanego mappingu do bieżącego, przydatne do dzielenia wspólnej konfiguracji między service. Merge keys nie są częścią YAML 1.2, ale większość parserów, w tym js-yaml, nadal je akceptuje dla zgodności. Diff traktuje anchors i aliases jak zwykły tekst, więc przemianowany anchor wyświetla się czysto.

Czy mogę wkleić JSON do narzędzia diff YAML?

Tak. JSON jest ścisłym podzbiorem YAML 1.2, więc każdy poprawny dokument JSON jest też poprawnym dokumentem YAML. Możesz je nawet mieszać, jeśli chcesz, wrzucając flow collection w stylu JSON do pliku w stylu blokowym. Do czystej pracy z JSON nasze narzędzie diff JSON ma przyciski formatowania i walidacji rozumiejące JSON, w tym pretty-print i sort-keys.

Dlaczego parser odrzuca mój plik, gdy używam tabów?

Bo specyfikacja YAML zakazuje tabów jako wcięć. Z specu 1.2.2: "To maintain portability, tab characters must not be used in indentation." Taby są dozwolone wewnątrz wartości skalarnych (string może zawierać tab), tylko nie na początku linii, gdzie mierzone jest wcięcie. Lekarstwo to szybkie znajdź-i-zamień z taba na dwie lub cztery spacje, zależnie od konwencji, której twój plik już używa.

Czy to darmowe i czy muszę się rejestrować?

Tak i nie. Jest darmowe, bez konta, bez okresu próbnego i bez limitu na to, ile plików porównujesz. Wklej dwa dokumenty YAML, a diff pojawia się od razu. Nic nie jest zamknięte za logowaniem, a przyciski kopiowania i pobierania w każdym panelu dają czyste wyjście, bez znaku wodnego ani śmieci doklejonych do twoich manifestów.

Czym to się różni od innych narzędzi diff YAML online?

Porównanie wykonuje się w całości w twojej przeglądarce, więc twój YAML nigdy nie jest wysyłany. Wiele narzędzi diff online najpierw POST-uje go na serwer, co jest realnym problemem przy manifestach z referencjami do secret lub wewnętrznymi hostname. Podświetlanie jest na poziomie znaku, a nie całej linii, więc odwrócony boolean czy jednospacjowa zmiana wcięcia pojawia się dokładnie, zamiast oznaczać całą linię jako zmienioną.

Czy może porównać dwa pliki YAML, które prześlę?

Tak. Kliknij Prześlij w którymkolwiek panelu, by wczytać plik .yaml lub .yml wprost z dysku, zamiast wklejać. Możesz przesłać jedną stronę i wkleić drugą, albo przesłać obie. Pliki są czytane lokalnie w przeglądarce i nigdy nigdzie nie wysyłane. Ponieważ w YAML wcięcie jest znaczące, przesłanie zachowuje oryginalne odstępy, zamiast ryzykować wklejenie, które psuje taby.

Czy mogę porównać więcej niż dwa pliki YAML naraz?

Nie w jednym widoku. Zbudowano go dla dwóch stron, oryginału i zmienionej wersji, co pasuje do tego, jak manifesty wędrują przez pipeline. Jeśli masz trzy lub więcej wersji, porównuj je parami: v1 z v2, potem v2 z v3. Przy multi-document YAML z kilkoma separatorami --- w jednym pliku diff czyta cały stream jako jeden blok, więc najpierw podziel i posortuj dokumenty, jeśli kolejność to szum.

Czy bezpiecznie jest wkleić wrażliwy YAML, jak secrets czy config Kubernetes?

Jest bezpieczniej niż w większości narzędzi, bo nic nie opuszcza twojej maszyny. Edytor, podświetlanie składni i diff działają lokalnie, bez wysyłania, bez logowania twoich danych i bez podróży do chmury. Możesz to sam sprawdzić: otwórz DevTools i obserwuj zakładkę Network podczas porównywania. Pamiętaj jednak, że wartości base64 w Secret nie są zaszyfrowane, więc zachowaj taką samą ostrożność jak przy każdym zwykłym tekście.

Prywatność i jak to działa

Twój YAML nie opuszcza przeglądarki. Edytor, podświetlanie składni i diff działają na twojej maszynie, lokalnie. Żadnej analityki na twoim wejściu, żadnych logów, żadnej podróży do chmury. Format, którego się trzymamy, to specyfikacja YAML 1.2.2. Aby zweryfikować, że nic nie jest wysyłane, otwórz DevTools i obserwuj zakładkę Network podczas porównywania.