II. وابستگیها
وابستگیها را به صراحت اعلام و جدا کنید
اکثر زبانهای برنامهنویسی یک سیستم بستهبندی برای توزیع کتابخانههای پشتیبانی ارائه می دهند، مانند CPAN برای Perl یا Rubygems برای Ruby. کتابخانههایی را که از طریق یک سیستم بستهبندی نصب میشوند، میتوان در سراسر سیستم (معروف به “بستههای سایت”) نصب کرد یا در مسیر نصب برنامه (معروف به “کتابخانه” یا “بستهبندی”) قرار داد.
یک برنامه دوازده-سازه هرگز به وجود ضمنی بستههای محیط نصب متکی نیست. همهی وابستگیها را به طور کامل و دقیق از طریق مانیفست اعلام وابستگی اعلام میکند. علاوه بر این، از یک ابزار * جداسازی وابستگی * در طول اجرا استفاده می کند تا اطمینان حاصل شود که هیچ کتابخانهی وابستهای به طور ضمنی از سیستم میزبان “مورد استفاده قرار نمیگیرد”. مشخصات کتابخانهها، کامل و صریح به طور یکسان برای تولید و توسعه اعمال می شود.
برای مثال، Bundler برای Ruby قالب مانیفست «Gemfile» را برای اعلام وابستگیها و «bundle exec» را برای جداسازی وابستگی ارائه میکند. در پایتون دو ابزار جداگانه برای این مراحل وجود دارد - Pip برای اعلان استفاده می شود و Virtualenv برای جداسازی. حتی C نیز Autoconf را برای اعلام وابستگی دارد، و پیوند استاتیک میتواند جداسازی وابستگیها را فراهم کند. مهم نیست که زنجیرهی ابزار چیست، اعلان وابستگی و جداسازی باید همیشه با هم استفاده شوند – فقط یکی یا دیگری برای برآورده کردن دوازده-سازه کافی نیست.
یکی از مزایای اعلام وابستگی صریح این است که راهاندازی را برای توسعهدهندگانی که تازه وارد برنامه شدهاند، ساده میکند. توسعهدهندهی جدید میتواند کد برنامه را بر روی دستگاه توسعهی خود بررسی کند، و فقط به مفسر یا مترجم زبان برنامهنویسی و مدیر وابستگی نصب شده را به عنوان پیشنیاز احتیاج دارد. همچنین میتوانند همهچیز مورد نیاز برای اجرای کد برنامه را به سادگی با دستور build نصب کنند. به عنوان نمونه، برای ساخت بستهها در Ruby/Bundler دستور ‘bundle install’ به کار میرود، در حالی که برای Clojure/Leiningen دستور ‘lein deps’ استفاده میشود.
برنامههای کاربردی دوازده-سازه نیز به وجود ضمنی هیچ ابزار سیستمی میزبان متکی نیستند. به عنوان مثال می توان به ارسال به ImageMagick یا «curl» اشاره کرد. در حالی که این ابزارها ممکن است در بسیاری از سیستمها یا حتی بیشتر سیستمها وجود داشته باشند، هیچ تضمینی وجود ندارد که در همه سیستمهایی که برنامه ممکن است در آینده اجرا شود، وجود داشته باشند، یا اینکه نسخهی موجود در سیستم آینده با برنامه سازگار باشد. اگر برنامه نیاز به استفاده از یک ابزار سیستمی داشته باشد، آن ابزار باید به همراه وابستگیهای برنامه عرضه شود.