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
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
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
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.
| Topic | What this tool does |
|---|
| Wcięcie | Tylko 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. |
|---|
| Taby | Zakazane 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 wielodokumentowe | Trzy 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 problem | Niecytowane 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ą. |
|---|
| Kodowanie | Spec 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.
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.