TOML neboli Tom's obvious, minimal language je jednoduchý formát pro psaní strukturovaných souborů a hodí se pro tvorbu konfiguračních souborů. Poprvé jsem TOML využil u své bakalářské práce ve Finsku.
Možnosti jak vytvořit konfigurační soubor
Článek je především o formátu TOML, je dobré ale zmínit i další možnosti, jako je třeba YAML, XML nebo Windows INI. V článku What is your favourite config file format? je anketa, kde lidé hlasovali ohledně oblíbeného formátu. V době vydání článku byl TOML starý teprve pár měsíců, přesto již nasbíral solidní procento hlasů.
Některé často používané formáty s jejich plusy a mínusy:
- YAML - velmi robustní, podporuje odkazování, přetypování, pole, tabulky a mnoho dalšího. Dobře se čte i člověku, musí se ale dávat pozor na odsazení. Je opravdu velmi rozšířen.
- JSON - podpora v mnoha jazycích bez dalších knihoven. Nepodporuje komentáře a velmi jednoduše ho lze rozbít při ruční úpravě. Nevhodný pro úpravu člověkem dle mého názoru
- XML - podporuje komentáře. Lze upravit i člověkem, je to ale velmi pracné a opět lze celé XML rozbít jednoduše, navíc při exportu z programu neobsahuje odsazení a je na 1 řádku. Dle mě nevhodné, pokud bude upravován lidmi.
- INI - Velmi jednoduchý na zápis, podporuje pouze sekce (1 zanoření) a záznamy jsou na řádcích jako klíč-hodnota. Ve Windows nativní funkce pro získání záznamů.
TOML a jeho podpora
Na Githubu toml-lang je kromě dokumentace a specifikace i seznam knihoven pro různé jazyky, které dokáží TOML číst a/nebo zapisovat. A seznam rozhodně není krátký, C, C++, C#, Erlang, Go, Haskell, Java, Node.js, Perl, PHP, Python, Ruby, Scala a další.
TOML musí být v kódování UTF-8 a podporuje komentáře, záznamy klíč-hodnota, běžné datové typy string, int, float bool, date, time, datetime. Ale i složené jako pole, tabulky a pole tabulek. Následující kód je vzorový soubor TOML:
# Vzorový dokument ve formátu TOML title = "TOML Example" # top-level záznam # Tabulka a její podzáznamy # odsazení tabulátory nebo mezerami vnořených záznamů není nutné [owner] name = "Tom Preston-Werner" # klíč může obsahovat mezery, čísla i UTF8 znaky "date of birth" = 1979-05-27T07:32:00-08:00 [database] server = "192.168.1.1" ports = [ 8001, 8001, 8002 ] connection_max = 5000 enabled = true # Zanoření tabulek [servers] [servers.alpha] ip = "10.0.0.1" dc = "eqdc10" [servers.beta] ip = "10.0.0.2" dc = "eqdc10" [clients] # Pole data = [ ["gamma", "delta"], [1, 2] ] hosts = [ "alpha", "omega" ] # Pole tabulek [[logins]] username = "root" password = "...passwordHash..." [[logins]] username = "arxeiss" password = "...passwordHash..." [[logins]] username = "pavel.kutac" password = "...passwordHash..."
PHP a TOML
Pro PHP je napsáno několik knihoven, následující ukázka používá knihovnu od Yo! Symfony, která je kompatibilní a otestována s TOML v0.4.0 a PHP 5.3 - 7.0.
# config.toml je stejný, jako výše uvedený příklad $config = \Yosymfony\Toml\Toml::Parse('config.toml'); print_r($config);
// Výsledek načteníarray( ['title'] => "TOML Example" ['owner'] => array( ['name'] => "Tom Preston-Werner" ['date of birth'] => DateTime( ['date'] => 1979-05-27 07:32:00.000000 ['timezone_type'] => 1 ['timezone'] => -08:00 ) ) ['database'] => array( ['server'] => "192.168.1.1" ['ports'] => array( [0] => 8001 [1] => 8001 [2] => 8002 ) ['connection_max'] => 5000 ['enabled'] => true ) ['servers'] => array( ['alpha'] => array( ['ip'] => "10.0.0.1" ['dc'] => "eqdc10" ) ['beta'] => array( ['ip'] => "10.0.0.2" ['dc'] => "eqdc10" ) ) ['clients'] => array( ['data'] => array( [0] => array( [0] => "gamma" [1] => "delta" ) [1] => array( [0] => 1 [1] => 2 ) ) ['hosts'] => array( [0] => "alpha" [1] => "omega" ) ) ['logins'] => array( [0] => array( ['username'] => "root" ['password'] => "...passwordHash..." ) [1] => array( ['username'] => "arxeiss" ['password'] => "...passwordHash..." ) [2] => array( ['username'] => "pavel.kutac" ['password'] => "...passwordHash..." ) ) )
A jaký je váš oblíbený formát pro konfigurační soubory? Napište do komentářů
K tomuto článku již není možné přidávat další komentáře
Komentáře
Pěkný článek.
Ty formáty konfiguračních souborů jsou si samozřejmě dost podobné, ale mně se docela líbí NEON, který využívá Nette. (https://ne-on.org/)
Díky, vypadá to pěkně. Bohužel na Neon nejsou knihovny pro jiné jazyky. Pro PHP ok, ale třeba teď potřebuji knihovnu pro C#. Ale vše záleží na konkrétním použití.