فاکتور دوم: Dependencies
فاکتور دوم در 12-Factor App مربوط به وابستگیها (Dependencies) است. هر اپلیکیشن باید تمام وابستگیهای خود را بهصورت صریح اعلام کرده و از آنها در محیط اجرا بهطور ایزوله استفاده کند. وابستگیها میتوانند شامل کتابخانهها، فریمورکها یا ابزارهای جانبی باشند.
بیشتر زبانهای برنامهنویسی یک سیستم بستهبندی (Package Manager) ارائه میدهند تا کتابخانهها و ابزارهای مورد نیاز اپلیکیشن نصب و مدیریت شوند. برای مثال:
- Perl: CPAN
- Ruby: Rubygems
- Python: Pip
- C: Autoconf و لینککردن استاتیک
کتابخانهها میتوانند بهصورت سیستمی نصب شوند (site packages) یا داخل پوشه اپلیکیشن قرار بگیرند (vendoring یا bundling). اپلیکیشنهای 12-Factor هرگز به وجود ضمنی بستهها یا ابزارهای سیستمی تکیه نمیکنند. تمام وابستگیها باید در یک فایل اعلان وابستگی مشخص شوند و از ابزار ایزولهسازی برای جلوگیری از نفوذ وابستگیهای محیط استفاده شود.

ابزارهای رایج برای مدیریت وابستگی
- Ruby: استفاده از Bundler با فایل
Gemfileبرای اعلان وابستگیها وbundle execبرای ایزولهسازی - Python: Pip برای اعلان وابستگی و Virtualenv برای ایزولهسازی
- C: استفاده از Autoconf برای اعلان وابستگی و لینککردن استاتیک برای ایزولهسازی
مزیت اعلام صریح وابستگیها
اعلام صریح وابستگیها باعث میشود راهاندازی پروژه برای توسعهدهندگان جدید بسیار ساده شود. کافی است کدبیس اپلیکیشن را روی ماشین خود بررسی کنند و تنها پیشنیاز نصب زبان برنامهنویسی و ابزار مدیریت وابستگی باشد. سپس با یک دستور ساخت (Build Command) deterministic، تمام وابستگیها نصب شده و اپلیکیشن آماده اجرا میشود.
مثال دستور ساخت در زبانهای مختلف:
- Ruby/Bundler:
bundle install - Clojure/Leiningen:
lein deps
عدم تکیه بر ابزارهای سیستمی
اپلیکیشنهای 12-Factor نباید به وجود ابزارهای سیستمی فرضی مانند ImageMagick یا curl وابسته باشند. حتی اگر این ابزارها روی اکثر سیستمها نصب باشند، هیچ تضمینی وجود ندارد که در آینده روی همه سیستمها در دسترس باشند یا نسخه آنها با اپلیکیشن سازگار باشد. اگر اپلیکیشن نیاز به چنین ابزاری دارد، باید ابزار مورد نظر داخل اپلیکیشن قرار داده شده و ایزوله شود.
مثال عملی
فرض کنید یک اپلیکیشن وب دارید که برای پردازش تصاویر از ابزار ImageMagick استفاده میکند. در بسیاری از سیستمها ممکن است ImageMagick نصب باشد، اما هیچ تضمینی وجود ندارد که روی تمام سرورها یا محیطهای staging و production همین نسخه نصب شده باشد.
یک اپلیکیشن 12-Factor این مشکل را با Vendoring حل میکند: به جای تکیه بر وجود ابزار در سیستم، نسخه مورد نیاز ImageMagick را داخل خود اپلیکیشن قرار میدهیم و مسیر اجرای آن را در کد مشخص میکنیم.
با این روش، توسعهدهنده جدیدی که کد را روی ماشین خود اجرا میکند، یا سرور جدیدی که برای production راهاندازی میشود، دقیقاً همان نسخه ImageMagick را استفاده میکنند. نتیجه این است که رفتار اپلیکیشن در همه محیطها یکسان و قابل پیشبینی خواهد بود و احتمال بروز خطا به دلیل نسخههای متفاوت ابزارهای سیستمی از بین میرود.
این مثال نشان میدهد که اعلام صریح و ایزوله کردن وابستگیها، نه تنها نصب و راهاندازی اپلیکیشن را ساده میکند، بلکه قابلیت اعتماد و ثبات اپلیکیشن را در محیطهای مختلف تضمین میکند.