composer چیست و چرا باید از آن استفاده کنیم

نوشته شده توسط:

Composer یک Dependency Manager یا مدیریت کننده وابستگی هاست که چند وقتی است توسط برنامه نویسان PHP طرفداران بسیاری پیدا کرده است.

چرا از Composer استفاده می‌کنیم

از آن جا که هیچ کس چرخ را از اول اختراع نمی‌کند پس باید از Composer استفاده کرد!

اگر پروژه هایتان در PHP چند خطی و ساده هستند نیازی به Composer ندارید ولی اگر پروژه هایتان پیچیده شود و نیازمند کتابخانه‌های متعدد و حرفه‌ای زیادی است Composer وظیفه مدیریت کتابخانه‌ها و بروز رسانی آن‌ها را بر عهده می‌گیرد.

با این کار شما همیشه مطمین هستید پروژه شما با بروز ترین کتابخانه‌ها در حال کار است.

فریم‌ورک‌ها و سیستم‌های مدیریت محتوا نیز نصب خود را با Composer به شما پیشنهاد می‌دهند. خود فریم‌ورک‌ها نیز گاهی از ده‌ها کتابخانه استفاده می‌کنند که برخی از آن‌ها توسط اشخاص مستقل دیگری توسعه داده می‌شوند که شما با Composer علاوه بر بروز رسانی خود فریم‌ورک، دیگر کتابخانه‌های موجود در لیست لایبراری‌ها را نیز بروز رسانی می‌کنید.

عملیات بروز رسانی نیز با یک خط دستور در Command line تمام سیستم‌های عامل به سادگی صورت می‌پذیرد.

Composer کار نصب کتابخانه‌های وابسته را نیز به سادگی انجام می‌دهد، به این معنا که اگر کتابخانه خاصی را می‌خواهید نصب کنید که خود نیازمند کتابخانه‌های دیگر است این عملیات به صورت کاملا خودکار انجام می‌پذیرد.

Composer هشدارهای لازم را نیز به کاربران هنگام نصب می‌دهد. مثلا اگر کتابخانه‌ای به PHP نسخه 5.4 به بالا نیاز داشته باشد، و نسخه PHP نصب شده روی سیستم شما کمتر از 5.4 باشد به شما هشدار می‌دهد.

Composer کار گروهی را نیز ساده تر کرده است، چون ممکن است افراد دیگر دخیل در پروژه اطلاع کاملی از کتابخانه‌ها نداشته باشند و فقط از آن‌ها استفاده می‌کنند، بنابراین با Composer هر شخص دخیل در پروژه‌ای به راحتی پروژه را بروز رسانی و توسعه می‌دهد.

Composer در واقع امکانی را فراهم آورده است که بروز رسانی پروژه‌ها بعد از مدت زمان طولانی از تکمیل پروژه به سادگی و با چند کلیک انجام بپذیرد و نیاز به توسعه دهنده تا حد زیادی برای بروز رسانی کاهش یابد.

ایده Composer تلفیقی از ابزارهای npm و Bundler و PEAR است، که بسیار موفق عمل کرده و نظرها را به خود جلب کرده است.

Composer سورس کدها را از کجا گردآوری می‌کند

سایت با نام packagist.org در اختیار توسعه دهندگان قرار دارد که کدهای خود را در آن آپلود می‌کنند. سایت packagist به عنوان منبع اصلی Composer برای نصب پکیج‌ها به برنامه نویسان خدمات می‌رساند.

Composer را چگونه نصب کنیم

Composer بسیار ساده در هر سیستمی نصب می‌شود، و نیازمندی خاصی غیر از PHP نسخه بالاتر از 5.3.2 ندارد.

برای نصب Composer در ویندوز تنها کافی است برنامه Composer را از لینک زیر دانلود کنید:

دانلود

پس از نصب این برنامه سعی کنید سیستم خود را ریستارت کنید و از اضافه شدن مسیر فایل اجرایی Composer به Path‌های سیستم خود اطمینان حاصل کنید.

برای نصب Composer در لینوکس از کامند زیر استفاده کنید:

curl -s https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

با کدهای فوق هم Composer نصب می‌شود و هم به پوشه bin اضافه می‌شود تا در آینده تنها با وارد کردن composer بتوانید از این ابزار استفاده کنید.

اگر Composer روی سیستم شما نصب بود در هر مسیری و با CMD دستور زیر را اجرا کنید:

composer init

تمام مراحل را Enter بزنید، جز مرحله Author که به آن no بدهید. فایلی مانند زیر به پروژه شما اضافه می‌شود:

{
    "name": "hitos/php_pro",
    "require": {}
}

یک فایل به نام composer.json ایجاد می‌شود که هر پکیجی در require وارد کنیم، برای پروژه شما دانلود می‌شود. مثلا::

{
    "name": "hitos/php_pro",
    "require": {
		"silex/silex": "~2.0"
	}
}

عبارت silex/silex نام یک فریم‌ورک PHP است و ~2.0 ورژن آن است. توجه کنید که composer.json از قوانین فایل‌های json تبعیت می‌کند. بخش require مهم ترین بخش آن است.

بعد از اجرای دستور composer install در کامند لاین یک پوشه به نام vendor اضافه می‌شود که فریم‌ورک silex و دیگر کتابخانه‌های مورد نیاز اضافه می‌شوند.

در پایین مثالی را بررسی می‌کنیم که در آن به فایل composer.json کتابخانه bootstrap را نیز اضافه می‌کنیم:

{
    "name": "hitos/php_pro",
    "require": {
		"silex/silex": "~2.0",
		"twbs/bootstrap": "^3.3"
	}
}

در دفعات بعدی باید دستور composer update را در خواست دهیم تا کتابخانه boostrap به پوشه vendor اضافه خواهد شد.

البته بدون ساخت فایل composer.json نیز می‌توانیم پکیج‌ها را نصب کنیم. مانند استفاده از دستور زیر در کامند لاین:

composer require "monolog/monolog":"1.0.*"

با کد فوق فایل composer.json اضافه شده و بعد از اضافه شدن پکیج monolog فرایند پیاده سازی این کتابخانه انجام می‌شود.

نکته: اگر فایل composer.json از قبل موجود باشد پکیج monolog افزوده خواهد شد.

چه تفاوتی میان composer install و  composer update وجود دارد؟

اگر اولین باری است که composer install یا composer update را اجرا می‌کنید درواقع تفاوتی در آن‌ها نمی‌بینید. پس از اولین اجرا اگر دقت کنید فایلی با نام composer.lock به مسیر جاری افزوده می‌شود که اطلاعات آخرین پکیج‌های نصب شده را در خود اضافه می‌کند.

اگر فایل composer.lock در مسیر جاری موجود باشد، حتی با تغییر composer.json دیگر نمی‌توانید از composer install استفاده کنید، چون اطلاعات موجود در composer.lock در اولیت هستند.

فایده وجود فایل composer.lock در این است که در کارهای گروهی وجود داشتن این کار اطمینانی ایجاد می‌کند که تمام برنامه نویسان در حال استفاده از پکیج‌های واحدی باشند.

ولی اگر فایل composer.lock را داشتید و خواستید باز با این وجود پکیج‌های خود را بروز رسانی کنید از دستور composer update استفاده کنید تا اطلاعات موجود در composer.lock بروز رسانی شوند.

قوانین وارد کردن ورژن پکیج‌ها در composer.json

همانطور که در مثال‌های فوق بیان کردیم، در فایل composer.json مقابل نام پکیج باید شماره ورژن پکیج را نیز وارد کنیم. وارد کردن شماره ورژن پکیج از قواعدی خاص پیروی می‌کند که در پایین به آن‌ها اشاره می‌کنیم.

با کد زیر به Composer می‌گویید نسخه‌هایی از پکیج را نصب کند که بالاتر از 2.2 و کوچکتر مساوی 3.5 باشد:

>2.2 <=3.5

عبارت زیر پکیج‌هایی با شماره ورژن بالاتر از 2.6 و کوچکتر از 2.7 را نصب می‌کند:

2.6.*

عبارت زیر منجر به نصب پکیج‌ها با شماره ورژن بالا تر از 2.6 تا کوچکتر از 3 خواهد شد:

2.6~

استفاده از عبارت زیر منجر به نصب پکیج‌ها بین بزرگتر مساوی 5.0 تا کوچکتر مساوی 6.0 می‌شود:

5.0 - 6.0

فراخوانی خودکار کلیه کتابخانه ها

وقتی برای پروژه خود پکیج‌های متنوعی داریم طبیعی است که فراخوانی همه آن‌ها کار ساده‌ای نیست، مخصوصا اگر کار گروهی دائما پکیج‌ها در حال اضافه شدن و یا کم شدن باشند، عملیات فراخوانی همه پکیج‌ها گاهی دچار مشکل می‌شود.

همانطور که می‌دانید برای فراخوانی فایل‌های مختلف باید برای هر کدام یک require در فایل اصلی ایجاد کنید، که کاری نا عاقلانست، چون پروژه‌های مختلف هزاران کلاس مختلف دارند.

composer برای حل این مشکل فایلی با نام autoload در پوشه vendor ایجاد می‌کند که با اضافه کردن آن به پروژه‌های php خود می‌توانید تمامی کتابخانه‌ها را یک جا داشته باشید. مانند زیر:

require'vendor/autoload.php';
//در اینجا می‌توانید کتابخانه‌ها را فراخوانی کنید

برای ساخت مجدد فایل autoload از دستور زیر در کامند لاین استفاده کنید:

composer dump-autoload --optimize

اضافه کردن پروژه خود به autoload ابزار Composer

فرض کنید شما یک پروژه اصلی دارید که قرار است از فایل‌ها و کتابخانه‌های موجود در vendor استفاده کند، بعلاوه این که خود این پروژه شما نیز باید به autoload افزوده شود.

در پوشه اصلی پروژه خود که فایل conposer.json نیز آن جا قرار گرفته است یک پوشه به نام mypro ایجاد کرده و در آن یک کلاس با نام‌های class1.php ایجاد کرده و سورس زیر را در آن می‌گذاریم:

<?php
namespace App;

class class1
{
    public $name = __FILE__;
}

یک فایل دیگر نیز به نام class2.php ایجاد و سورس زیر را در آن می‌گذاریم. دستور __FILE__ موقعیت کنونی فایل را مشخص می‌کند.

حال به سراغ composer.json رفته و به آن یک آیتم به نام autoload به شکل زیر اضافه می‌کنیم:

{
    "name": "hitos/php_pro",
    "require": {
		"silex/silex": "~2.0",
		"twbs/bootstrap": "^3.3"
	},
	"autoload" : {
		"psr-4" : {
			"App\\" : "mypro/"
		}
	}
}

autoload فوق از استاندارد psr-4 برای مقدار دهی استفاده می‌کند. همانطور که می‌بینید App نام namespace کلاس‌های مورد نظر ما و mypro نام پوشه‌ای است که کلاس‌ها را در آن قرار دادیم.

حال دستور composer dumpautoload در CMD وارد می‌کنیم تا تغییرات مورد نیاز در vendor انجام شود. آن گاه یک فایل index.php در مسیر اصلی پروژه ایجاد و اطلاعات زیر را در آن بگذارید:

<?php
require 'vendor/autoload.php';

$class = new \App\class1();
echo $class->name;

حال با اجرای این دستور می‌بینید بدون این که نیاز باشد فایل class1.php را در این جا require کنیم، مقدار name این کلاس چاپ می‌شود.

چگونه پروژه خود را به لیست منابع Composer اضافه کنیم؟

اگر توسعه دهنده نرم افزار Open Source باشید، شاید مایل باشید نرم افزار و سورس‌های خود را با استفاده از Composer در اختیار دیگران قرار دهید.

اولین راه استفاده از سامانه packagist.org است. همانطور که در بالا گفته شد، Composer از لیستی در سایت packagist.org بهره می‌برد که می‌توانید در این سایت اکانت بسازید و پروژه خود را به آن اضافه کنید.

در پروژه خود باید فایلی با نام composer.json داشته باشید که در آن نام، توضیحات، کیوردهای، نیازمندی ها، نویسندگان، لایسنس و صفحه اصلی دسترسی به پروژه موجود باشد.

مثلا در پایین یک نمونه برای پروژه‌ای معین را مشاهده می‌کنید:

{
    "name": "hitosproject/hitos-application",
    "description": "Hitos Application for Symfony",
    "license": "BSD-3-Clause",
    "keywords": [
        "application",
        "symfony"
    ],
    "authors": [
        {
            "name": "Mahdi Musavi",
            "email": "mahdi@gmail.com"

        }
    ],
    "homepage": "https://hitos.ir/",
    "require": {
        "php": ">=5.3.3",
        "symfony/symfony": "2.8.*"
    }
}

برای ساخت خودکار فایل فوق، در کامند لاین دستور زیر را وارد کرده و Enter را فشار دهید:

composer init

اما راه کار دیگری نیز وجود دارد و آن این است که به فایل composer.json آدرس صفحه GitHub پروژه را بدهید، و این صفحه را به عنوان Repository به Composer بشناسانید. نمونه‌ای را در پایین می‌بینید:

{
    "name": "hitos/blog",
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/username/hello-world"
        }
    ],
    "require": {
        "acme/hello-world": "dev-master"
    }
}

همانطور که در بالا می‌بینید توانستیم یک پروژه GitHub را به عنوان یک Repository به فایل composer.json اضافه کنیم.

چگونه Composer را بروز رسانی کنیم

برای بروز رسانی composer می‌توانید از دستور زیر استفاده کنید:

composer self-update
تگ ها: windows / ویندوز linux / لینوکس دانلود متن باز / open source لاراول / Laravel سیمفونی / symfony کدایگنایتر / Codeigniter
نظر خود را برای این مطلب وارد کنید
دریافت خبرنامه
سجاد

چرا در مورد namespace ها صحبت نکردید ؟ مقالتون خیلی خوب بود ولی اینو کم داشت

پاسخ:

ممنون از یادآوری، اضافه شد!

وحید
ممنون استفاده کردم. مفید بود
سید محمد علی نیکوئی

سلام
با تشکر از مقاله بسیار عالیتون
فقط دو تا سوال
1- از این سایت (https://packagist.org) که با این دستور
"composer create-project "PackageName" "File storage location" "Version Of Package
پکیج ای دانلود می کنیم نحوه استفاده اش به چه شکله ؟

2- وقتی یه پروژه با این پکیج ها نوشته شد همه فایل های پکیج ها رو باید روی هاست آپلود کنیم ؟

پاسخ:

سلام

بله همه چیز باید روی هاست آپلود بشه.

موضوعات بخش برنامه نویسی و نرم افزار

مطالب برگزیده برنامه نویسی php

مطالب برگزیده سایت