Przestałem ręcznie zarządzać 30 plikami JSON dzięki temu jednemu narzędziu

Przestałem ręcznie zarządzać 30 plikami JSON dzięki temu jednemu narzędziu

Jsonnet to potężne narzędzie do integracji wartości konfiguracyjnych z kodem, umożliwiające generowanie plików w JSON, TOML i YAML poprzez wykorzystanie zmiennych oraz funkcji.

Jeśli myślałeś o tym, jak zintegrować wartości konfiguracyjne ze swoim kodem, mam coś, co może Cię zaciekawić. To nie tylko alternatywa dla JSON, ale prawdziwa maszyna napędowa dla konfiguracji.

Jsonnet rozszerza JSON, przekształcając dane w coś wyjątkowego. Łączy pliki JSON za pomocą współdzielonych wartości. Definiujesz zmienne i funkcje w uniwersalnych plikach Jsonnet, a potem generujesz pliki w JSON, TOML i YAML.

Szybka demonstracja

JSON na sterydach

Jsonnet jest podobny do JSON, ale bez konieczności używania cudzysłowów wokół kluczy. Aby to zobaczyć, zainstaluj Jsonnet przez menedżera pakietów i uruchom:

jsonnet --exec '{ hello: "world" }'

Użycie "exec" sprawia, że Jsonnet traktuje podaną ścieżkę jako kod.

Sprawdźmy coś bardziej zaawansowanego. Wykonując jsonnet example.jsonnet, uzyskam ten kawałek Jsonnet...

local replicas = 3; { name: "web-server", enabled: true, replicas: replicas, cpuLimit: 0.5, maintainer: null, ports: [80, 443, 8080], resources: { requests: { memory: "256Mi" }, limits: { memory: "512Mi" }, }, }

Generuje to ten JSON:

{ "cpuLimit": 0.5, "enabled": true, "maintainer": null, "name": "web-server", "ports": [80, 443, 8080], "replicas": 3, "resources": { "limits": { "memory": "512Mi" }, "requests": { "memory": "256Mi" } } }

Możesz dostrzec użycie zmiennej "replicas", ale nie jest to jego jedyna moc. Jsonnet obsługuje funkcje, dziedziczenie, warunki, importy, a nawet listy przypominające Pythona.

Dziedziczenie to kluczowy atut—mimo że niektórzy je krytykują w językach konfiguracyjnych, uważam, że jest niezbędne.

local base = { foo: "foo", bar: { x: "x", baz: "baz", }, }; { child: base + { foo: "inherited", bar+: { baz: "inherited", }, }, }

"base + ..." łączy wartości z "base". "bar+" pozwala na rozszerzenie tego zagnieżdżonego obiektu; bez tego "bar" dziecka zastępuje "bar" rodzica.

Funkcje mogą zwracać różne typy danych, w tym inne obiekty:

local foo(bar) = bar * 2; { result: foo(21), }

A oto przykład warunków:

local enabled = true; { status: if enabled then "on" else "off", }

Do czego używać Jsonnet

Integracja plików konfiguracyjnych i kodu

Jsonnet sprawdza się w konkretnych sytuacjach:

  • Automatyzacja procesów budowy z plikami lub szablonami konfiguracyjnymi
  • Replikacja typów/kodu w różnych lokalizacjach

Jsonnet obsługuje JSON, TOML, INI i YAML. Wiele współczesnych narzędzi korzysta z tych formatów, wymagając specyficznej wiedzy (np. nazw usług, adresów URL). Przykłady to Docker, Kubernetes oraz różne narzędzia do orkiestracji. Centralizacja specyficznych wartości konfiguracyjnych to znaczne ułatwienie.

Kod wykonywalny często korzysta z zmiennych środowiskowych, a Jsonnet generuje surowe ciągi, co pozwala stworzyć praktycznie każdy plik i wstawić odpowiednie wartości. Czasem tworzę pliki .env, innym razem surowe typy w Pythonie lub Go. Jsonnet dysponuje imponującą biblioteką do manipulacji ciągami. Choć nie jest idealny, rzadko napotykam problemy, których nie mogę rozwiązać.

Dlaczego lubię Jsonnet

Prostota, szerokie wsparcie, rozwiązanie realnych problemów

Łączenie kodu to temat, którym zajmowałem się długo. Często tworząc monorepo dla...

Duże projekty to prawdziwe labirynty, a powiązania między językami a pakietami mogą być skomplikowane. Docker wymaga mnóstwa plików konfiguracyjnych – dla produkcji, rozwoju, testowania, a nawet debugowania. Mam co najmniej 20-30 plików, które spinają mój projekt w całość. Bez Jsonnet zabłądziłbym w tym chaosie.

Jsonnet to strzał w dziesiątkę.

Prosty w obsłudze, jakby łączył w sobie JSON i Pythona. Wystarczyło, że usiadłem i zacząłem, a nauka nie wiązała się z dodatkowymi kosztami czasowymi, jak w przypadku KCL czy CUE.

Google stoi za Jsonnet, a jego powszechność zapewnia mu długowieczność.

Kilka wskazówek do Jsonnet

Rejestruj mądrze, planując wokół ograniczeń

Jsonnet jak wiele języków konfiguracyjnych nie ma efektów ubocznych. Nie odsłania możliwości dotykania dysku czy robienia zapytań sieciowych.

Traktuję Jsonnet jako centralne źródło. W katalogu "config" w moim repozytorium leżą wszystkie pliki konfiguracyjne i biblioteki Jsonnet. W folderze z moimi standardowymi plikami konfiguracyjnymi tworząc Jsonnetowe odpowiedniki, nadaję im zbliżone nazwy:

repo_root/ ├── config/ │ ├── lib/ │ │ ├── math.jsonnet │ │ └── foo.jsonnet │ └── nx/ │ ├── foo.jsonnet │ └── bar.jsonnet └── apps/ ├── website/ │ ├── package.jsonnet │ ├── package.json │ ├── project.jsonnet │ ├── project.json │ ├── docker-compose.dev.yaml │ └── docker-compose.dev.jsonnet └── database/ ├── project.jsonnet └── project.json

Używam narzędzi do uruchamiania zadań (jak Taskfile, Mise czy Nx), aby natrafić na pliki Jsonnet w "apps", po czym generuję obok nich odpowiadające pliki konfiguracyjne. Te importują wartości i funkcje "config", dostarczając konkretne dane dla danej dziedziny.

Nadal eksploruję możliwości konfigurowania Jsonnet, ale pamiętaj, że nie podnosi funkcji ani "lokalnych" zmiennych. To zmienia układ wartości konfiguracyjnych. Wspiera natomiast leniwe obliczenia, co daje sporą elastyczność.

Wykładania przenosi deklaracje na górę ich zasięgu, więc możesz wywołać funkcję przed jej definicją. Jest to obserwowalne w JavaScript i innych językach.

local x = y, y = "y"; { foo: self.bar, bar: "bar", x: x, }

Wartości w obiektach i blokach "lokalnych" zmiennych (jak w pierwszej linii podanego kodu) wykonują leniwe obliczenia, co oznacza, że przetwarzane są jedynie w momencie potrzeby. Dlatego kolejność nie ma właściwie znaczenia – możemy organizować nasze wartości, jak tylko chcemy.

Jsonnet to prosta droga do opanowania, nie zniknie i rozwiązuje realny problem większych projektów: łączenie odseparowanych komponentów. Dlaczego miałbym z niego nie skorzystać?

Nie jest doskonały. Ale na tyle dobry, że można go dopasować do własnych potrzeb w sposób, którego pierwotnie nie przewidywano.

Jsonnet wypełnił lukę w moich projektach. Potrafi generować kod z wartości konfiguracyjnych, co jest ogromnym atutem.

Chcesz coś więcej o Jsonnet? Zajrzyj na ich stronę główną, dokumentację i repozytorium GitHub. Dowiedz się więcej.

Jeśli ciekawią Cię artykuły podobne do Przestałem ręcznie zarządzać 30 plikami JSON dzięki temu jednemu narzędziu, zajrzyj do kategorii Aplikacje i odkryj jeszcze więcej interesujących treści.

Indeks
  1. Szybka demonstracja
    1. JSON na sterydach
  2. Do czego używać Jsonnet
    1. Integracja plików konfiguracyjnych i kodu
  3. Dlaczego lubię Jsonnet
    1. Prostota, szerokie wsparcie, rozwiązanie realnych problemów
  4. Kilka wskazówek do Jsonnet
    1. Rejestruj mądrze, planując wokół ograniczeń

Możesz być zainteresowany

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Go up