II. Dépendances
Déclarez explicitement et isolez les dépendances
La plupart des languages de programmation offrent des systèmes pour créer des paquets à partir de bibliothèques afin de les distribuer, tel que CPAN pour Perl ou Rubygems pour Ruby. Les bibliothèques installées à travers un système de packaging peuvent être installés à travers tout le système, ou bien limités au répertoire contenant l'application (que l'on appelle les "vendor" ou "bundles")
Une application 12 facteurs ne dépend jamais de l'existence implicite de packages au niveau du système. Elle déclare toutes ses dépendances, complètement et exactement, à travers un manifeste de déclaration de dépendances. De plus, elle utilise un outil d'isolation des dépendances durant l'exécution afin d'assurer qu'aucune dépendances implicite ne s'introduise depuis le système environnant. Les spécifications complètes et explicites sont appliquées uniformément en développement comme en production.
Par exemple, Gem Bundler pour Ruby fournit le format de manifeste Gemfile
pour la déclaration des dépendances, ainsi que la commande bundle exec
pour l'isolation des dépendances. En python, il y a deux outils séparés pour ces étapes -- Pip est utilisé pour la déclaration et Virtualenv pour l'isolation. Même le C dispose d'Autoconf pour les déclarations de dépendances, et la liaison statique peut fournir l'isolation des dépendances. Peut importe la chaine d'outils, la déclaration et l'isolation des dépendances doivent toujours être utilisées ensemble -- seulement l'un ou l'autre ne suffit pas à satisfaire les 12 facteurs.
Un des bénéfices de la déclaration explicite des dépendances est que cela simplifie la mise en place pour les développeurs qui découvrent l'application. Les nouveaux développeurs peuvent jeter un oeil à la base de code de l'application sur leur machine de développement, en ayant besoin uniquement d'avoir de quoi exécuter le langage ainsi que le gestionnaire de dépendances installé en pré-requis. Ils pourront mettre en place tout ce qui est nécessaire pour faire fonctionner le code de l'application de manière déterministe grâce à une commande d'assemblage (commande de build). Par exemple, la commande d'assemblage pour Ruby/Bundler est bundle install
, alors que pour Clojure/Leiningen c'est lein deps
.
Les applications 12 facteurs ne s'appuient pas sur l'existence implicite d'outils système, comme par exemple ImageMagick ou curl
. Bien que ces outils puissent exister sur beaucoup voire la plupart des systèmes d'exploitations, il n'y a pas de garantie qu'ils existeront sur tous les systèmes où l'application sera exécutée à l'avenir, ou si la version disponible sur un système futur sera compatible avec l'application. Si l'application dépend d'un outil système, cet outil doit être distribué avec l'application.