The Twelve-Factor App

II. Dependencies

Jawnie zadeklaruj i wydziel zależności

Większość języków programowania oferuje narzędzia do dystrybucji dodatkowych bibliotek, takie jak CPAN dla Perla lub Rubygems dla języka Ruby. Biblioteki zainstalowane w ten sposób mogą być dostępne dla całego systemu (określane jako “site packages”) lub zakres ich działania może być ograniczony dla pojedynczego projektu lub aplikacji (określane jako “vendoring” lub “bundling”).

Aplikacja 12factor nigdy nie jest zależna od bibliotek zainstalowanych dla całego systemu. Wszystkie zależności są dokładnie określone przez dokument zawierający ich kompletną listę (dependency declaration manifest). Ponadto taka aplikacja korzysta z narzędzia służącego do izolacji tych zależności podczas działania aplikacji. W ten sposób ma się pewność, że np. jakaś biblioteka nie jest przypadkiem jedną z tych zainstalowanych w zewnętrznym środowisku, w którym działa aplikacja. Inaczej podobna sytuacja mogłaby uniemożliwiać poprawne działanie aplikacji w innym środowisku, gdzie takiej biblioteki by brakowało. Pełna i dokładna specyfikacja bibliotek używanych przez aplikację jest identyczna dla zarówno środowiska developerskiego jak i produkcyjnego.

Np. Bundler dla Ruby’ego używa pliku Gemfile dla deklaracji bibliotek z których korzysta aplikacja oraz komendę bundle exec do izolacji tych zależności. W Pythonie istnieją dwa oddzielne narzędzia dla tych zadań – Pip jest używany do deklaracji oraz Virtualenv do izolacji. Nawet język C posiada narzędzie Autoconf do deklaracji zależności, a statyczne wiązania mogą zapewnić izolację zalenożności. Bez względu na użyte narzędzia, deklaracja i izolacja zależności muszą być zawsze stosowane razem. Użycie tylko jednej z nich nie jest wystarczające by spełnić wymogi 12factor.

Jedną z niewątpliwych korzyści deklaracji zależności jest uproszczenie początkowej konfiguracji aplikacji dla developera. Nowy programista może pobrać kod źródłowy z repozytorium. Następnie, posiadając wcześniej skonfigurowane środowisko danego języka i narzędzie do zarządzania jego bibliotekami, jest w stanie zainstalować wszystkie moduły i biblioteki potrzebne dla działania aplikacji przy pomocy jednej komendy. Taką komendą np. dla Ruby’ego/Bundlera jest bundle install, a dla Clojure/Leiningen jest to lein deps.

Aplikacje zgodne z 12factor również nie są zależne od systemowych narzędzi. Wśród przykładów można wymienić ImageMagick czy też curl. Pomimo, że narzędzia te mogą być dostępne na wielu lub nawet większości systemów, nie ma gwarancji, że będą istniały na wszystkich środowiskach, w których będzie uruchamiana aplikacja w przyszłości lub że ich wersja będzie kompatybilna. Jeśli aplikacja korzysta z jakiegokolwiek systemowego narzędzia, powinno być ono osobno do niej dołąćzone.