Konfigurační soubory a TOML

Pavel Tipy & triky, Android, JavaScript, PHP

Možností, jak vytvořit konfigurační soubor pro svůj program je hodně. Každý formát má výhody a nevýhody. V dnešním článku je popsán ne příliš známý, přesto rozšířený formát TOML.

Konfigurační soubory a TOML

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

Přidat komentář

Právě odpovídáte na existující komentář. Zrušit

Komentáře

Hando

28.9.2017 15:30

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/)

Odpovědět

Pavel

http://www.kutac.cz/blog/ 28.9.2017 16:04

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í.

Novinky z blogu

Do Hyundai na interní prohlídku

Jak jsme zavítali do fabriky Hyundai Dymos v Nošovicích na jednu interní exkurzi. Absolvovali bezpečnostním školením, prošli si výrobní halu a také mohli zkusit vyrobit...

Další články