II. Dipendenze
Dipendenze dichiarate ed isolate
Molti linguaggi di programmazione offrono dei sistemi di packaging per la distribuzione delle proprie librerie, come CPAN per Perl o Rubygems per Ruby. Le librerie installate attraverso questi sistemi, inoltre, possono essere identificate come "system-wide" (attive a livello di sistema), oppure posizionate nella directory della singola applicazione (in questo caso si parla di "vendoring" o "bundling").
Un'applicazione che aderisce alla twelve-factor non si basa mai sull'esistenza implicita di librerie system-wide. Le dipendenze vengono tutte dichiarate, tramite un manifest dedicato. Inoltre, viene contemplato anche l'uso di un tool di isolamento delle dipendenze durante l'esecuzione, in modo tale da assicurarsi che non ci siano delle "dipendenze implicite" che creino interferenze nel sistema in cui ci si trova. La specifica completa ed esplicita delle dipendenze si applica in modo uniforme: sia in production che in sviluppo.
Ad esempio, Gem Bundler per Ruby offre il supporto di un file-manifesto Gemfile
da usare per la dichiarazione delle dipendenze e bundle exec
per il loro isolamento. In Python invece troviamo altri due tool per questi scopi -- Pip viene usato per la dichiarazione e Virtualenv per l'isolamento. Anche C ha Autoconf per la dichiarazione di dipendenze, mentre lo static linking si occupa dell'isolamento. Non importa quale sia il toolchain usato, le operazioni di dichiarazione ed isolamento vanno sempre effettuate. In caso contrario, l'applicazione non aderisce più alla metodologia.
Un altro importante beneficio di una dichiarazione esplicita delle dipendenze sta nel fatto che semplifica di molto la configurazione iniziale per gli sviluppatori appena entrati a lavorare al progetto. Il nuovo arrivato non dovrà fare altro che effettuare un check out della codebase nella propria macchina di sviluppo, occupandosi di dover installare solo ed esclusivamente le dipendenze, appunto, dichiarate. Molto spesso è inoltre presente un build command che permette di automatizzare il processo. Per Ruby/Bundler si usa bundle install
, mentre per Clojure/Leiningen c'è lein deps
.
Ogni applicazione che aderisce alla metodologia twelve-factor, inoltre, non si basa mai sull'esistenza di un qualsiasi tool di sistema. Alcuni esempi sono ImageMagick o curl. Nonostante questi software esistano già su buona parte dei sistemi in circolazione, non è comunque detto che siano presenti su tutti quelli su cui girerà l'applicazione in futuro. Se l'app non può fare a meno di questo tool, si dovrebbe prendere in considerazione l'idea di "vendorizzarlo" nell'applicazione stessa.