II. Závislosti
Explicitně deklarujte a izololujte závislosti.
Většina programovacých jazyků poskytuje balíčkovací systém pro distribuci podpůrných knihoven, například CPAN pro Perl nebo Rubygems pro Ruby. Knihovny instalované skrze balíčkovací systém mohou být instalovány globálně pro celý systém (nazýváme “site packages”) nebo pouze lokálně v rámci adresáře dané aplikace (nazýváme “vendoring” nebo “bundling”).
Twelve-factor aplikace se nikdy nespoléhá na implicitní existenci globálních systémových balíčků. Svoje závislosti deklaruje úplně a přesně pomocí manifestu deklarovaných závislostí. Dále používá nástroje pro izolaci závislostí, aby bylo zajištěno, že při běhu aplikace žádné implicitní zavislosti neprosakují z okolního systému. Úplná explicitní deklarace závislostí je použita jednotně pro produkci i vývoj.
Například Bundler pro Ruby poskytuje Gemfile
manifest formát pro deklaraci závislostí a bundle exec
pro izolaci závislostí. Pro Python jsou to dva rozdílné nástroje, Pip je použit pro deklaraci závislostí a Virtualenv pro jejich izolaci. Dokonce i C má Autoconf pro deklaraci závislostí a statické linkování poskytuje izolaci závislostí. Nehledě na použitou sadu nástrojů, deklarace a izolace závislostí musí být vždy aplikovány společně, použití pouze jednoho nebo pouze druhého není dostatečné pro splnění podmínek twelve-factor metodiky.
Jednou z výhod explicitní deklarace závislostí je to, že zjednodušuje počáteční rozběhnutí aplikace pro nové vývojáře. Nový vývojář si jen naklonuje repozitář aplikace do svého vývojového prostředí a jako prerekvizity mu postačí nainstalované běhové prostředí jazyka a příslušný správce závislostí. Vše potřebné pro rozběhnutí aplikace se zajistí deterministicky build příkazem . Například, build příkaz pro Ruby/Bundler je bundle install
, pro Cloujure/Leiningen je to lein deps
.
Twelve-factor aplikace se nespoléhají na implicitní existenci jakýchkoli systémových nástrojů. Příkladem může být spouštění ImageMagick nebo curl
přes shell. I když tyto nástroje existují na mnoha a možná i většině aktuálně používaných systémů, neexistuje žadná záruka, že tyto nástroje budou existovat na systémech, kde aplikace poběží v budoucnu a nebo že budou na budoucích systémech dostupné v kompatibilní verzi. Pokud aplikace potřebuje spouštět nějaký nástroj přes shell, tak by měl být daný nástroj součástí aplikace.