
در پروژههای مدرن PHP، مدیریت کتابخانهها و پکیجهای خارجی یکی از مهمترین بخشهای چرخه توسعه نرمافزار است. هر پروژهای، از یک API ساده تا یک سیستم سازمانی پیچیده، معمولا به مجموعهای از کتابخانههای third-party وابسته است. این وابستگیها اگر بهدرستی مدیریت نشوند، میتوانند منجر به ناسازگاری نسخهها، افزایش بدهی فنی، و دشواری در دپلویمنت شوند.
ابزار استاندارد و پذیرفتهشده در اکوسیستم PHP برای حل این مسئله، ابزار Composer است، یک مدیر وابستگی که امکان تعریف، نصب، بهروزرسانی و مدیریت نسخههای پکیجها را فراهم میکند.
کامپوزر یک ابزار مدیریت پکیج در PHP است که به شما اجازه میدهد وابستگیهای پروژه را به صورت declarative تعریف کنید. برخلاف روشهای قدیمی مثل کپی کردن دستی کتابخانهها در پروژه، کامپوزر یک رویکرد استاندارد و قابل تکرار ارائه میدهد.
مدیریت خودکار وابستگیها
حل خودکار تداخل نسخهها (Dependency Resolution)
استفاده از Semantic Versioning
بارگذاری خودکار کلاسها (Autoloading)
یکپارچگی با اکوسیستم مدرن PHP
مدیریت وابستگی یعنی کنترل کتابخانههایی که پروژه شما به آنها نیاز دارد، همراه با نسخههای دقیق آنها.
در یک پروژه ساده ممکن است شما از این کتابخانهها استفاده کنید:
HTTP Client
Router
ORM
Logger
Cache System
اگر هرکدام از اینها خودشان وابستگیهای دیگری داشته باشند، یک درخت وابستگی (Dependency Tree) شکل میگیرد.
کامپوزر دقیقا همین درخت را مدیریت میکند.
قلب هر پروژه کامپوزر فایل composer.json است. این فایل شامل اطلاعات زیر است:
نام پروژه
نسخه PHP مورد نیاز
لیست وابستگیها
کانفیگ autoload
اسکریپتها (scripts)
{ "name": "mjpakzad/laravel-settings", "require": { "php": ">=8.1", "monolog/monolog": "^3.0" } }
در این مثال:
پروژه نیاز به PHP 8.1 یا بالاتر دارد
از کتابخانه لاگینگ Monolog استفاده میکند
کامپوزر معمولاً به دو شکل نصب میشود:
curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer
با دستور زیر میتوان بررسی کرد که آیا کامپوزر نصب شده و اگر نصب شده کدام ورژن آن نصب شده است:
composer --version
برای نصب یک پکیج:
composer require mjpakzad/laravel-settings
این دستور سه کار انجام میدهد:
دانلود پکیج
ثبت در composer.json
ایجاد composer.lock
یکی از مهمترین بخشهای مدیریت وابستگی در Composer فایل composer.lock است.
این فایل:
نسخه دقیق همه وابستگیها را قفل میکند
باعث تکرارپذیری در محیطهای مختلف میشود
composer.json: تعریف وابستگیها در این فایل انجام میشود.
composer.lock: کار این فایل، قفل نسخههای نصب شده است.
یکی از ویژگیهای کلیدی Composer، autoloading است.
بدون autoload باید فایلها را دستی include کنید:
require 'User.php'; require 'Order.php';
اما با Composer:
require 'vendor/autoload.php';
Composer از استاندارد PSR-4 پشتیبانی میکند:
{ "autoload": { "psr-4": { "App\\": "src/" } } }
این یعنی:
نیم اسپیس
App\به پوشهsrc/مپ میشود.
یک پروژه استاندارد معمولا ساختار زیر را دارد:
project/ │ ├── src/ │ ├── Controllers/ │ ├── Services/ │ ├── vendor/ ├── composer.json ├── composer.lock └── index.php
کامپوزر از نسخهبندی معنایی (SemVer) استفاده میکند:
MAJOR.MINOR.PATCH
مثال:
1.0.0: نسخه اولیه
1.1.0: افزودن قابلیت
1.1.1: رفع باگ
^1.2: سازگار با نسخههای 1.x
~1.2: تغییرات محدود
*: هر نسخه
به این معنی که اگر هر کدام از اپراتورهای بالا استفاده شوند، در زمان نصب و آپدیت پکیجها، محدودیت معادل آن اعمال خواهد شد.
برای آپدیت پکیجها:
composer update
برای یک پکیج خاص:
composer update mjpakzad/laravel-settings
install: نصب دقیق نسخههای lock شده
update: پیدا کردن نسخههای جدید و بهروزرسانی lock
composer remove mjpakzad/laravel-settingd
این دستور:
پکیج را حذف میکند
composer.json را آپدیت میکند
composer.lock را بازنویسی میکند
گاهی دو پکیج نیاز به نسخههای متفاوت یک dependency دارند.
راهحل:
بررسی محدودیت نسخهها
استفاده از نسخههای سازگار
پوشه vendor ممکن است بسیار بزرگ شود.
راهحل:
استفاده از production install:
composer install --no-dev
اگر composer.lock وجود نداشته باشد، هر محیط نسخه متفاوتی نصب میکند.
راهحل:
همیشه lock file را commit کنید
در پروژههای enterprise، کامپوزر فقط یک ابزار ساده نیست، بلکه بخشی از معماری سیستم است.
در pipeline معمولا:
composer install --no-dev --optimize-autoloader
کاهش زمان load کلاسها
افزایش performance در production
فریمورک Laravel به شدت به Composer وابسته است.
هر پکیج Laravel از طریق Composer مدیریت میشود.
مثال:
composer create-project laravel/laravel app
بدون آن تکرارپذیری از بین میرود.
بد:
*
خوب:
^2.0
"require-dev": { "phpunit/phpunit": "^10" }
composer normalize
یا:
composer update --lock
composer why-not package/name
Composer فقط یک package manager نیست، بلکه یک dependency resolution engine است.
این engine:
گراف وابستگیها را میسازد
constraintها را حل میکند
نسخه بهینه را انتخاب میکند
از نظر تئوری، این مسئله در دسته Constraint Satisfaction Problem (CSP) قرار میگیرد.
در معماری میکروسرویس:
هر سرویس دیپندنسی مستقل دارد
نسخهها جدا مدیریت میشوند
کاهش کاپلینگ بین سیستمها
برای بهبود پرفورمنس:
composer dump-autoload -o
composer dump-autoload --classmap-authoritative
کامپوزر میتواند با OPcache ترکیب شود.
composer audit
Packagist اصلی:
برای جلوگیری از supply chain attack
Composer امکان اجرای script دارد:
"scripts": { "test": "phpunit", "post-install-cmd": [ "php artisan optimize" ] }
کامپوزر یکی از ستونهای اصلی توسعه مدرن PHP است. بدون آن، مدیریت وابستگیها در پروژههای متوسط و بزرگ عملا غیرممکن یا بسیار پرهزینه خواهد بود.
درک صحیح از:
dependency resolution
version constraints
autoloading
lock file behavior
برای هر توسعهدهنده PHP ضروری است.
اگر Composer را صرفا یک ابزار نصب پکیج ببینیم، بخش بزرگی از قدرت آن را از دست دادهایم. در واقع کامپوزر یک لایه زیرساختی برای مدیریت پیچیدگی نرمافزار است.