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ářů
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í.