Tvůrci konfigurace pro ASP.NET
Stephen Molloy a Rick Anderson
Tvůrci konfigurací poskytují moderní a agilní mechanismus pro ASP.NET aplikace pro získání hodnot konfigurace z externích zdrojů.
Tvůrci konfigurací:
- Jsou k dispozici v rozhraní .NET Framework 4.7.1 a novějším.
- Poskytuje flexibilní mechanismus pro čtení hodnot konfigurace.
- Vyřešte některé základní potřeby aplikací při přechodu do kontejneru a cloudového prostředí zaměřeného na cloud.
- Dá se použít ke zlepšení ochrany konfiguračních dat tím, že v konfiguračním systému .NET použijete dříve nedostupné zdroje (například Azure Key Vault a proměnné prostředí).
Běžným scénářem, který můžou tvůrci konfigurace zpracovat, je poskytnout základní mechanismus výměny klíčů a hodnot pro oddíly konfigurace, které se řídí vzorem klíč/hodnota. Koncept rozhraní .NET Framework nástroje ConfigurationBuilders není omezen na konkrétní oddíly nebo vzory konfigurace. Mnoho tvůrce konfigurací ale pracuje ve Microsoft.Configuration.ConfigurationBuilders
vzoru klíč/hodnota (github, NuGet).
Následující nastavení platí pro všechny tvůrce konfigurace klíč/hodnota v Microsoft.Configuration.ConfigurationBuilders
souboru .
Tvůrci konfigurace používají externí zdroj informací o klíč/hodnotě k naplnění vybraných prvků klíče/hodnoty konfiguračního systému. Konkrétně oddíly <appSettings/>
a <connectionStrings/>
oddíly dostávají zvláštní zacházení od tvůrců konfigurace. Tvůrci pracují ve třech režimech:
Strict
– Výchozí režim. V tomto režimu funguje tvůrce konfigurace pouze v dobře známých oddílech konfigurace klíč/hodnota-cen.Strict
režim vyčíslí každý klíč v oddílu. Pokud se v externím zdroji najde odpovídající klíč:- Tvůrci konfigurace nahradí hodnotu ve výsledné části konfigurace hodnotou z externího zdroje.
Greedy
- Tento režim úzce souvisí s režimemStrict
. Místo toho, aby byly omezeny na klíče, které již existují v původní konfiguraci:- Tvůrci konfigurace přidají do výsledné části konfigurace všechny páry klíč/hodnota z externího zdroje.
Expand
- Pracuje s nezpracovaným XML předtím, než se parsuje do objektu oddílu konfigurace. Lze si ji představit jako rozšíření tokenů v řetězci. Jakákoli část nezpracovaného řetězce XML, která odpovídá vzoru${token}
, je kandidátem na rozšíření tokenu. Pokud se v externím zdroji nenajde žádná odpovídající hodnota, token se nezmění. Tvůrci v tomto režimu nejsou omezeni na<appSettings/>
oddíly a<connectionStrings/>
oddíly.
Následující kód z web.config umožňuje EnvironmentConfigBuilder v Strict
režimu:
<configuration>
<configSections>
<section name="configBuilders"
type="System.Configuration.ConfigurationBuildersSection,
System.Configuration, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"
restartOnExternalChanges="false" requirePermission="false" />
</configSections>
<configBuilders>
<builders>
<add name="MyEnvironment"
type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder,
Microsoft.Configuration.ConfigurationBuilders.Environment,
Version=1.0.0.0, Culture=neutral" />
</builders>
</configBuilders>
<appSettings configBuilders="MyEnvironment">
<add key="ServiceID" value="ServiceID value from web.config" />
<add key="ServiceKey" value="ServiceKey value from web.config" />
</appSettings>
<connectionStrings configBuilders="MyEnvironment">
<add name="default" connectionString="Data Source=web.config/mydb.db" />
</connectionStrings>
Následující kód přečte <appSettings/>
a <connectionStrings/>
zobrazí se v předchozím souboru web.config :
using System;
using System.Configuration;
using System.Web.UI;
namespace MyConfigBuilders
{
public partial class About : Page
{
public string ServiceID { get; set; }
public string ServiceKey { get; set; }
public string ConString { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
ServiceID = ConfigurationManager.AppSettings["ServiceID"];
ServiceKey = ConfigurationManager.AppSettings["ServiceKey"];
ConString = ConfigurationManager.ConnectionStrings["default"]
?.ConnectionString;
}
}
}
Předchozí kód nastaví hodnoty vlastností na:
- Hodnoty v souboru web.config , pokud klíče nejsou nastaveny v proměnných prostředí.
- Hodnoty proměnné prostředí, pokud jsou nastaveny.
Bude například ServiceID
obsahovat:
- Hodnota ServiceID z web.config, pokud proměnná
ServiceID
prostředí není nastavená. - Hodnota
ServiceID
proměnné prostředí, pokud je nastavena.
Následující obrázek ukazuje <appSettings/>
klíče/hodnoty z předchozího souboru web.config nastaveného v editoru prostředí:
Poznámka: Možná budete muset ukončit a restartovat Visual Studio, abyste viděli změny v proměnných prostředí.
Předpony klíčů můžou zjednodušit nastavení klíčů, protože:
- Konfigurace rozhraní .NET Framework je složitá a vnořená.
- Externí zdroje klíč/hodnota jsou obvykle základní a ploché podle povahy. Například proměnné prostředí nejsou vnořené.
Pomocí některého z následujících přístupů vložte do konfigurace proměnné prostředí i <appSettings/>
<connectionStrings/>
do konfigurace:
- S výchozím
Strict
režimemEnvironmentConfigBuilder
a příslušnými názvy klíčů v konfiguračním souboru. Tento přístup přijímá předchozí kód a revize. Pomocí tohoto přístupu nemůžete mít identicky pojmenované klíče v obou<appSettings/>
i<connectionStrings/>
. - Použijte dva
EnvironmentConfigBuilder
s vGreedy
režimu s odlišnými předponami astripPrefix
. Díky tomuto přístupu může aplikace číst<appSettings/>
a<connectionStrings/>
nemusí aktualizovat konfigurační soubor. V další části stripPrefix se dozvíte, jak to udělat. - Použijte dva
EnvironmentConfigBuilder
s vGreedy
režimu s odlišnými předponami. S tímto přístupem nemůžete mít duplicitní názvy klíčů, protože názvy klíčů se musí lišit podle předpony. Příklad:
<configuration>
<configSections>
<section name="configBuilders"
type="System.Configuration.ConfigurationBuildersSection,
System.Configuration, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"
restartOnExternalChanges="false" requirePermission="false" />
</configSections>
<configBuilders>
<builders>
<add name="AS_Environment" mode="Greedy" prefix="AppSetting_"
type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder,
Microsoft.Configuration.ConfigurationBuilders.Environment" />
<add name="CS_Environment" mode="Greedy" prefix="ConnStr_"
type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder,
Microsoft.Configuration.ConfigurationBuilders.Environment" />
</builders>
</configBuilders>
<appSettings configBuilders="AS_Environment">
<add key="AppSetting_ServiceID" value="ServiceID value from web.config" />
<add key="AppSetting_default" value="AppSetting_default value from web.config" />
</appSettings>
<connectionStrings configBuilders="CS_Environment">
<add name="ConnStr_default" connectionString="Data Source=web.config/mydb.db" />
</connectionStrings>
S předchozím kódem je možné použít stejný zdroj plochých klíč/hodnota k naplnění konfigurace pro dva různé oddíly.
Následující obrázek ukazuje <appSettings/>
klíče a <connectionStrings/>
hodnoty z předchozího souboru web.config nastaveného v editoru prostředí:
Následující kód načte <appSettings/>
klíče a <connectionStrings/>
hodnoty obsažené v předchozím souboru web.config :
public partial class Contact : Page
{
public string ServiceID { get; set; }
public string AppSetting_default { get; set; }
public string ConString { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
ServiceID = ConfigurationManager.AppSettings["AppSetting_ServiceID"];
AppSetting_default = ConfigurationManager.AppSettings["AppSetting_default"];
ConString = ConfigurationManager.ConnectionStrings["ConnStr_default"]
?.ConnectionString;
}
}
Předchozí kód nastaví hodnoty vlastností na:
- Hodnoty v souboru web.config , pokud klíče nejsou nastaveny v proměnných prostředí.
- Hodnoty proměnné prostředí, pokud jsou nastaveny.
Například použití předchozího souboru web.config , klíčů/hodnot v předchozím obrázku editoru prostředí a předchozího kódu jsou nastaveny následující hodnoty:
Key | Hodnota |
---|---|
AppSetting_ServiceID | AppSetting_ServiceID z proměnných env |
AppSetting_default | hodnota AppSetting_default z env |
ConnStr_default | ConnStr_default val z env |
stripPrefix
: logická hodnota, výchozí hodnota false
.
Předchozí kód XML odděluje nastavení aplikace od připojovací řetězec, ale vyžaduje, aby všechny klíče v souboru web.config používaly zadanou předponu. Například předpona AppSetting
musí být přidána ServiceID
do klíče ("AppSetting_ServiceID"). V stripPrefix
souboru web.config se předpona nepoužívá. Předpona se vyžaduje ve zdroji tvůrce konfigurace (například v prostředí.) Předpokládáme, že většina vývojářů bude používat stripPrefix
.
Aplikace obvykle odstraňou předponu. Následující web.config odstraní předponu:
<configuration>
<configSections>
<section name="configBuilders"
type="System.Configuration.ConfigurationBuildersSection,
System.Configuration, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"
restartOnExternalChanges="false" requirePermission="false" />
</configSections>
<configBuilders>
<builders>
<add name="AS_Environment" mode="Greedy" prefix="AppSetting_"
stripPrefix="true"
type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder,
Microsoft.Configuration.ConfigurationBuilders.Environment,
Version=1.0.0.0, Culture=neutral" />
<add name="CS_Environment" mode="Greedy" prefix="ConnStr_"
stripPrefix="true"
type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder,
Microsoft.Configuration.ConfigurationBuilders.Environment,
Version=1.0.0.0, Culture=neutral" />
</builders>
</configBuilders>
<appSettings configBuilders="AS_Environment">
<add key="ServiceID" value="ServiceID value from web.config" />
<add key="default" value="AppSetting_default value from web.config" />
</appSettings>
<connectionStrings configBuilders="CS_Environment">
<add name="default" connectionString="Data Source=web.config/mydb.db" />
</connectionStrings>
V předchozím souboru default
web.config je klíč v souboru i <appSettings/>
<connectionStrings/>
v souboru .
Následující obrázek ukazuje <appSettings/>
klíče a <connectionStrings/>
hodnoty z předchozího souboru web.config nastaveného v editoru prostředí:
Následující kód načte <appSettings/>
klíče a <connectionStrings/>
hodnoty obsažené v předchozím souboru web.config :
public partial class About2 : Page
{
public string ServiceID { get; set; }
public string AppSetting_default { get; set; }
public string ConString { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
ServiceID = ConfigurationManager.AppSettings["ServiceID"];
AppSetting_default = ConfigurationManager.AppSettings["default"];
ConString = ConfigurationManager.ConnectionStrings["default"]
?.ConnectionString;
}
}
Předchozí kód nastaví hodnoty vlastností na:
- Hodnoty v souboru web.config , pokud klíče nejsou nastaveny v proměnných prostředí.
- Hodnoty proměnné prostředí, pokud jsou nastaveny.
Například použití předchozího souboru web.config , klíčů/hodnot v předchozím obrázku editoru prostředí a předchozího kódu jsou nastaveny následující hodnoty:
Key | Hodnota |
---|---|
ID služby | AppSetting_ServiceID z proměnných env |
default | hodnota AppSetting_default z env |
default | ConnStr_default val z env |
tokenPattern
: Řetězec, výchozí hodnota @"\$\{(\w+)\}"
Chování Expand
tvůrce prohledá nezpracovaný XML tokeny, které vypadají jako ${token}
. Vyhledávání se provádí pomocí výchozího regulárního výrazu @"\$\{(\w+)\}"
. Sada znaků, které odpovídají \w
, je přísnější než XML a mnoho zdrojů konfigurace povoluje. Použijte tokenPattern
, pokud je v názvu tokenu více znaků, než @"\$\{(\w+)\}"
je požadováno.
tokenPattern
:Řetězec:
- Umožňuje vývojářům změnit regulární výraz, který se používá pro porovnávání tokenů.
- Není provedeno žádné ověření, aby se zajistilo, že se jedná o dobře formátovaný, ne nebezpečný regulární výraz.
- Musí obsahovat skupinu zachycení. Celý regulární výraz musí odpovídat celému tokenu. Prvním zachycením musí být název tokenu, který se má vyhledat ve zdroji konfigurace.
<add name="Environment"
[mode|prefix|stripPrefix|tokenPattern]
type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder,
Microsoft.Configuration.ConfigurationBuilders.Environment" />
- Jedná se o nejjednodušší tvůrce konfigurace.
- Načte hodnoty z prostředí.
- Nemá žádné další možnosti konfigurace.
- Hodnota atributu
name
je libovolná.
Poznámka: V prostředí kontejneru Windows se proměnné nastavené za běhu vloží pouze do prostředí procesu EntryPointu. Aplikace, které běží jako služba nebo proces jiného než EntryPointu, tyto proměnné nezachytávají, pokud nejsou jinak vloženy prostřednictvím mechanismu v kontejneru. V případě kontejnerů založených na službě IIS/ASP.NET je aktuální verze ServiceMonitor.exe zpracovává pouze v rámci defaultAppPool. Jiné varianty kontejnerů založené na Windows mohou vyžadovat vývoj vlastního mechanismu injektáže pro procesy, které nejsou vstupními body.
Upozornění
Nikdy neukládejte hesla, citlivá připojovací řetězec ani jiná citlivá data ve zdrojovém kódu. Produkční tajné kódy by se neměly používat pro vývoj ani testování.
<add name="UserSecrets"
[mode|prefix|stripPrefix|tokenPattern]
(userSecretsId="{secret string, typically a GUID}" | userSecretsFile="~\secrets.file")
[optional="true"]
type="Microsoft.Configuration.ConfigurationBuilders.UserSecretsConfigBuilder,
Microsoft.Configuration.ConfigurationBuilders.UserSecrets" />
V předchozím kódu XML userSecretsFile
může cesta použít nebo ~/
~\
. Například cestu lze zapsat jako userSecretsFile="~/secrets.file
. Další informace najdete ve třídě ConfigurationBuilders Utils .
Tento tvůrce konfigurace poskytuje funkci podobnou ASP.NET Core Secret Manageru.
UserSecretsConfigBuilder lze použít v projektech rozhraní .NET Framework, ale musí být zadán soubor tajných kódů. Alternativně můžete definovat UserSecretsId
vlastnost v souboru projektu a vytvořit nezpracovaný soubor tajných kódů ve správném umístění pro čtení. Pokud chcete, aby externí závislosti zůstaly mimo projekt, je tajný soubor formátovaný ve formátu XML. Formátování XML je podrobnosti implementace a formát by se neměl spoléhat na. Pokud potřebujete sdílet soubor secrets.json s projekty .NET Core, zvažte použití SimpleJsonConfigBuilder. Formát SimpleJsonConfigBuilder
pro .NET Core by měl být také považován za podrobnosti implementace, které se můžou změnit.
Atributy konfigurace pro UserSecretsConfigBuilder
:
userSecretsId
- Toto je upřednostňovaná metoda pro identifikaci souboru tajných kódů XML. Funguje podobně jako .NET Core, která k uložení tohoto identifikátoruUserSecretsId
používá vlastnost projektu. Řetězec musí být jedinečný, nemusí být identifikátor GUID. Pomocí tohoto atributuUserSecretsConfigBuilder
vyhledáte v dobře známém místním umístění (%APPDATA%\Microsoft\UserSecrets\<UserSecrets Id>\secrets.xml
) soubor tajných kódů, který patří k tomuto identifikátoru.userSecretsFile
- Volitelný atribut určující soubor obsahující tajné kódy. Znak~
lze použít na začátku pro odkaz na kořen aplikace. Tento atribut nebouserSecretsId
atribut je povinný. Pokud jsou zadány oba,userSecretsFile
má přednost.optional
: logická hodnota, výchozí hodnotatrue
– Zabraňuje výjimce, pokud nelze najít soubor tajných kódů.- Hodnota atributu
name
je libovolná.
Soubor tajných kódů má následující formát:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<secrets ver="1.0">
<secret name="secret key name" value="secret value" />
</secrets>
</root>
<add name="AzureKeyVault"
[mode|prefix|stripPrefix|tokenPattern]
(vaultName="MyVaultName" |
uri="https:/MyVaultName.vault.azure.net")
[version="secrets version"]
[preloadSecretNames="true"]
type="Microsoft.Configuration.ConfigurationBuilders.AzureKeyVaultConfigBuilder,
Microsoft.Configuration.ConfigurationBuilders.Azure" />
AzureKeyVaultConfigBuilder čte hodnoty uložené ve službě Azure Key Vault.
vaultName
je povinný (název trezoru nebo identifikátor URI trezoru). Ostatní atributy umožňují řídit, ke kterému trezoru se připojit, ale jsou nezbytné pouze v případě, že aplikace není spuštěná v prostředí, se kterým pracuje Microsoft.Azure.Services.AppAuthentication
. Knihovna ověřování služeb Azure se používá k automatickému vyzvednutí informací o připojení z spouštěcího prostředí, pokud je to možné. Automatické vyzvednutí informací o připojení můžete přepsat poskytnutím připojovací řetězec.
vaultName
- Povinné, pokuduri
není zadané. Určuje název trezoru ve vašem předplatném Azure, ze kterého se mají číst páry klíč/hodnota.uri
– Připojí se k dalším poskytovatelům služby Key Vault se zadanouuri
hodnotou. Pokud není zadaný, Azure (vaultName
) je zprostředkovatelem trezoru.version
– Azure Key Vault poskytuje funkci správy verzí tajných kódů. Pokudversion
je zadáno, tvůrce načte pouze tajné kódy odpovídající této verzi.preloadSecretNames
– Ve výchozím nastavení se tvůrce dotazuje na všechny názvy klíčů v trezoru klíčů při inicializaci. Chcete-li zabránit čtení všech hodnot klíče, nastavte tento atribut nafalse
. Nastavením této funkce najednoufalse
přečtete tajné kódy po jednom. Čtení tajných kódů po jednom může být užitečné, pokud trezor umožňuje přístup "Získat", ale ne přístup "Seznam". Poznámka: Při použitíGreedy
režimupreloadSecretNames
musí býttrue
(výchozí.)
<add name="KeyPerFile"
[mode|prefix|stripPrefix|tokenPattern]
(directoryPath="PathToSourceDirectory")
[ignorePrefix="ignore."]
[keyDelimiter=":"]
[optional="false"]
type="Microsoft.Configuration.ConfigurationBuilders.KeyPerFileConfigBuilder,
Microsoft.Configuration.ConfigurationBuilders.KeyPerFile" />
KeyPerFileConfigBuilder je základní tvůrce konfigurace, který používá soubory adresáře jako zdroj hodnot. Název souboru je klíč a obsah je hodnota. Tento tvůrce konfigurace může být užitečný při spuštění v orchestrovaném prostředí kontejneru. Systémy, jako je Docker Swarm a Kubernetes, poskytují secrets
svým orchestrovaným kontejnerům Windows tímto způsobem klíč pro jednotlivé soubory.
Podrobnosti o atributu:
directoryPath
-Požadovaný. Určuje cestu, ve které se mají hledat hodnoty. Tajné kódy Dockeru pro Windows jsou ve výchozím nastavení uložené v adresáři C:\ProgramData\Docker\secrets .ignorePrefix
– Soubory, které začínají touto předponou, jsou vyloučeny. Výchozí hodnota je "ignorovat".keyDelimiter
- Výchozí hodnota jenull
. Pokud je zadaný, tvůrce konfigurace prochází více úrovní adresáře a vytváří názvy klíčů s tímto oddělovačem. Pokud jenull
tato hodnota, tvůrce konfigurace se podívá pouze na nejvyšší úroveň adresáře.optional
- Výchozí hodnota jefalse
. Určuje, jestli má tvůrce konfigurace způsobit chyby, pokud zdrojový adresář neexistuje.
Upozornění
Nikdy neukládejte hesla, citlivá připojovací řetězec ani jiná citlivá data ve zdrojovém kódu. Produkční tajné kódy by se neměly používat pro vývoj ani testování.
<add name="SimpleJson"
[mode|prefix|stripPrefix|tokenPattern]
jsonFile="~\config.json"
[optional="true"]
[jsonMode="(Flat|Sectional)"]
type="Microsoft.Configuration.ConfigurationBuilders.SimpleJsonConfigBuilder,
Microsoft.Configuration.ConfigurationBuilders.Json" />
Projekty .NET Core často používají soubory JSON pro konfiguraci. Tvůrce SimpleJsonConfigBuilder umožňuje použití souborů JSON .NET Core v rozhraní .NET Framework. Tento tvůrce konfigurace poskytuje základní mapování ze zdroje plochého klíče nebo hodnoty do konkrétních oblastí klíč/hodnota konfigurace rozhraní .NET Framework. Tento tvůrce konfigurace neposkytuje hierarchické konfigurace. Záložní soubor JSON je podobný slovníku, nikoli komplexnímu hierarchickému objektu. Lze použít hierarchický soubor s více úrovněmi. Tento zprostředkovatel flatten
je hloubku přidáním názvu vlastnosti na každé úrovni pomocí :
oddělovače.
Podrobnosti o atributu:
jsonFile
-Požadovaný. Určuje soubor JSON, ze který se má číst. Znak~
lze použít na začátku a odkazovat na kořen aplikace.optional
- Logická hodnota, výchozí hodnota jetrue
. Zabrání vyvolání výjimek v případě, že soubor JSON nebyl nalezen.jsonMode
-[Flat|Sectional]
.Flat
je výchozí možnost. PokudjsonMode
jeFlat
, soubor JSON je jedním zdrojem plochých klíč/hodnota.AzureKeyVaultConfigBuilder
Jedná seEnvironmentConfigBuilder
také o jeden plochý zdroj klíč/hodnota.SimpleJsonConfigBuilder
Při konfiguraci vSectional
režimu:- Soubor JSON je koncepčně rozdělený na nejvyšší úroveň do několika slovníků.
- Každý slovník se použije pouze v oddílu konfigurace, který odpovídá názvu vlastnosti nejvyšší úrovně, který je k nim připojen. Příklad:
{
"appSettings" : {
"setting1" : "value1",
"setting2" : "value2",
"complex" : {
"setting1" : "complex:value1",
"setting2" : "complex:value2",
}
}
}
Viz Pořadí provádění nástroje ConfigurationBuilders v úložišti aspnet/MicrosoftConfigurationBuilders GitHub.
Pokud tvůrci konfigurací nevyhovují vašim potřebám, můžete napsat vlastní. Základní KeyValueConfigBuilder
třída zpracovává režimy nahrazení a většinu předpon. Implementace projektu potřebuje pouze:
- Dědí ze základní třídy a implementuje základní zdroj párů klíč/hodnota prostřednictvím metody
GetValue
aGetAllValues
: - Přidejte do projektu Microsoft.Configuration.ConfigurationBuilders.Base .
using Microsoft.Configuration.ConfigurationBuilders;
using System.Collections.Generic;
public class MyCustomConfigBuilder : KeyValueConfigBuilder
{
public override string GetValue(string key)
{
// Key lookup should be case-insensitive, because most key/value collections in
// .NET Framework config sections are case-insensitive.
return "Value for given key, or null.";
}
public override ICollection<KeyValuePair<string, string>> GetAllValues(string prefix)
{
// Populate the return collection.
return new Dictionary<string, string>() { { "one", "1" }, { "two", "2" } };
}
}
Základní KeyValueConfigBuilder
třída poskytuje většinu práce a konzistentního chování v tvůrcích konfigurace klíč/hodnota.