The Twelve-Factor App

II. Εξαρτήσεις

Εξαρτήσεις εκπεφρασμένα δηλωμένες και απομονωμένες

Οι περισσότερες γλώσσες προγραμματισμού προσφέρουν ένα σύστημα πακεταρίσματος για διανομή των βιβλιοθηκών υποστήριξης, όπως το CPAN για την Perl ή το Rubygems για τη Ruby. Οι βιβλιοθήκες που εγκαθιστούνται μέσω του συστήματος πακεταρίσματος μπορουν να εγκατασταθούν είτε για όλο το σύστημα (γνωστές ως “καθολικά πακέτα”, “site packages”) είτε τοπικά μέσα στο φάκελο που περιέχει την εφαρμογή (γνωστές ως “προμηθευμένες”, “vendoring” ή ως “δέσμες”, “bundling”).

Μία εφαρμογή δώδεκα παραγόντων ποτέ δεν εξαρτάται απο την υπόρρητη ύπαρξη καθολικών πακέτων. Δηλώνει όλες τις εξαρτήσεις, ολοκληρωτικά και ακριβώς, μέσω ενός δηλωτικού αρχείου δήλωσης εξαρτήσεων (dependency declaration manifest). Επιπλέον, χρησιμοποιεί ένα εργαλείο απομόνωσης εξαρτήσεων (dependency isolation) κατά την διάρκεια της εκτέλεσης ώστε να εξασφαλίσει ότι καμία υπόρρητη εξάρτηση δεν θα “διαρρέυσει” απο το περιβάλλον σύστημα. Η πλήρης και εκπεφρασμένη δήλωση εξαρτήσεων εφαρμόζεται το ίδιο και στο περιβάλλον παραγωγής και στο περιβάλλον υλοποίησης (του προγραμματιστή).

Για παράδειγμα, το Bundler για τη Ruby προσφέρει τη δομή δηλωτικού Gemfile για δήλωση εξαρτήσεων και το bundle exec για απομόνωση εξαρτήσεων. Στην Python υπάρχουν δύο διαφορετικά εργαλεία για αυτά τα βήματα – το Pip χρησιμοποιείται για δήλωση και το Virtualenv για απομόνωση. Ακόμα και η C έχει το Autoconf για δήλωση εξαρτήσεων, και η στατική διασύνδεση μπορεί να προσφέρει απομόνωση εξαρτήσεων. Όποια και αν είναι η αλυσίδα εργαλείων, η δήλωση εξαρτήσεων και η απομόνωση πρέπει πάντα να χρησιμοποιούνται μαζί – μόνο η μία ή η άλλη δεν είναι ικανό για τους δώδεκα παράγοντες.

Ένα πλεονέκτημα της εκπεφρασμένης δήλωσης εξαρτήσεων είναι ότι απλοποιεί το στήσιμο της εφαρμογής για προγραμματιστές οι οποίοι είναι καινούργιοι στην εφαρμογή. Ο νέος προγραμματιστής μπορεί να κατεβάσει τη βάση κώδικα της εφαρμογής στο δικό του υπολογιστή, απαιτώντας να εγκατασταθούν μόνο το εκτελέσιμο της γλώσσας προγραμματισμού (language runtime) και ο διαχειριστής εξαρτήσεων (dependency manager) ως προαπαιτούμενα. Αυτά θα είναι ικανά να στήσουν οτιδήποτε χρειάζεται ώστε να τρέξει η εφαρμογή μέσω μιάς ντετερμινιστικής εντολής κατασκευής (build command). Για παράδειγμα, η εντολή κατασκευής για το Ruby/Bundler είναι bundle install, ενώ για την Clojure/Leiningen είναι lein deps.

Οι εφαρμογές δώδεκα παραγόντων επίσης δεν εξαρτώνται από την υπόρρητη ύπαρξη οποιουδήποτε εργαλείου συστήματος. Μερικά παραδείγματα είναι το ImageMagick ή το curl. Μπορεί αυτά τα εργαλεία να υπάρχουν σε πολλά ή στα περισσότερα συστήματα, αλλά κανείς δεν εγγυάται ότι θα υπάρχουν σε όλα τα συστήματα που θα τρέξουν την εφαρμογή στο μέλλον, ή ότι η έκδοση που θα υπάρχει θα είναι συμβατή με την εφαρμογή. Εάν η εφαρμογή χρειάζεται κάποιο τέτοιο εργαλείο συστήματος, αυτό το εργαλείο πρέπει να γίνει προμηθέυσιμο (vendored) μέσα στην εφαρμογή.