کامپوزر (Composer) چیست؟

کامپوزر (Composer) چیست؟

پیش از اینکه ببینیم Composer چیست و چه کاربردهایی دارا است، می‌بایست با مفهومی تحت عنوان Dependency Management آشنا شویم. زمانی که ما اقدام به برنامه‌نویسی می‌کنیم، فارغ از اینکه از چه فریمورک یا زبان برنامه‌نویسی برای کدنویسی استفاده می‌کنیم، گاهی‌اوقات نیاز به استفاده از کدها، پکیج‌ها، و لایبرری‌های سایر برنامه‌نویسان که به صورت اپن‌سورس در اینترنت عرضه شده‌اند داریم تا بتوانیم به جای آنکه خود اقدام به نوشتن مثلاً کلاس خاصی کنیم، از کدهایی که قبلاً توسط سایر دولوپرها نوشته شده و آزمایش خود را پس داده‌اند استفاده کنیم. به طور خلاصه، Composer ابزاری است که فرایند Dependency Management (مدیریت وابستگی‌) را برای دولوپرهای زبان برنامه‌نویسی PHP تسهیل می‌کند.

حال که متوجه شدیم منظور از Dependency Management چیست، اکنون می‌بایست با ابزاری آشنا شویم که این کار را به سادگی برای دولوپرهای PHP به انجام خواهد رساند و این ابزار Composer نام دارد.

Composer در ابتدای ماه مارس سال ۲۰۱۲ به صورت رایگان توسط Nils Adermann و Jordi Boggiano با الهام از ابزارهای npm نُود و bundler روبی توسعه داده شده و به دنیا عرضه شد و تاکنون استقبال بسیار خوبی از این ابزار به‌خصوص از طرف برنامه‌نویسان زبان برنامه‌نویسی PHP صورت گرفته است (لازم به ذکر است که برای استفاده از این ابزار حداقل به نسخهٔ 5.3.2 از زبان PHP نیاز خواهیم داشت). به طور خلاصه، کامپوزر یک ابزار کامندلاین است که در آن با استفاده از یکسری دستورات از پیش تعریف شده، می‌توان به مدیریت منابع خارجی برای استفاده در پروژهٔ خود پرداخت (نکته‌ای که در ارتباط با کامپوزر می‌بایست مد نظر داشته باشیم این است که این ابزار برخلاف ابزارهایی همچون apt هرگز چیزی را به صورت گلوبال (سراسری) دانلود نمی‌کند بلکه این ابزار بر پایهٔ هر پروژه کار می‌کند).

حال ممکن است این سؤال برای شما پیش بیاید که ابزار کامپوزر پکیج‌های مورد نیاز را از کجا دانلود می‌کند. در پاسخ به این سؤال، باید گفت که منبع اصلی که کامپوزر از آن استفاده می‌کند سایتی تحت عنوان packagist.org است که به عنوان ریپازیتوری پیش‌فرض پروژه‌های PHP می‌باشد که دولوپرهای فریمورک‌ها و لایبرری‌های مختلف پروژه‌های خود را در آنجا آپلود کرده و از آن پس با استفاده از کامپوزر می‌توان به کلیهٔ پکیج‌های قرار گرفته روی این سایت دسترسی داشت.

آشنایی با روش‌های نصب کامپوزر روی سیستم‌عامل‌های مختلف
کامپوزر را می‌توان هم روی سیستم‌عامل ویندوز نصب کرد و هم روی سیستم‌عامل‌هایی که بر پایهٔ یونیکس هستند مثل مکینتاش و گنو/لینوکس. به طور کلی، دو روش مختلف برای نصب و استفاده از کامپوزر داریم که تحت عناوین Locally و Globally (به ترتیب به معنی محلی و سراسری) شناخته می‌شوند.

نصب کامپوزر به صورت Locally
وقتی که کامپوزر را به صورت لوکال نصب کنیم، این ابزار پروژه-محور خواهد بود. به عبارت دیگر، صرفاً برای یک پروژهٔ خاص از این ابزار می‌توان استفاده کرد که به صورت یک فایل PHAR است که برای اجرای آن هم می‌بایست از دستور php composer.phar استفاده کرد (PHAR مخفف واژگان PHP Archive است که به منزلهٔ یک فرمت آرشیو برای زبان PHP است). به طور کلی، این روش خیلی توصیه نمی‌شود چرا که دولوپر را محدود به یک پروژه‌ٔ خاص می‌کند.

نصب کامپوزر به صورت Globally
در این روش، ما می‌توانیم فایل composer.phar را در هر جایی روی سیستم خود قرار داده و چنانچه این مکان جزئی از PATH سیستم‌عامل باشد، به صورت سراسری و از داخل هر پروژه‌ای می‌توانیم به این ابزار دسترسی پیدا کنیم. لازم به ذکر است که در سیستم‌عامل‌های مبتنی بر یونیکس مثل مک یا لینوکس، می‌توان فایل را قابل‌اجرا کرده تا در حین استفاده دیگر نیازی به تایپ کردن دستور php هم نداشته باشیم و این مسئله سرعت کار با کامپوزر را به مراتب افزایش خواهد داد.

نصب کامپوزر روی سیستم‌عامل گنو/لینوکس توزیع اوبونتو بسیار ساده است و صرفاً با کامند زیر می‌توان این ابزار را روی سیستم‌عامل خود نصب کرد:

$ curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer

همان‌طور که در کامند فوق مشخص است، با استفاده از ابزار curl فایل اینستالر کامپوزر را از سایت رسمی این ابزار دانلود کرده سپس آن را در مسیر usr/locl/bin/ قرار می‌دهیم و نامی هم که برایش در نظر می‌گیریم، composer خواهد بود. حال برای اینکه از صحت نصب اطمینان حاصل کنیم، دستور composer را در ترمینال وارد می‌کنیم:

$ composer
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.4.2 2017-05-17 08:17:52

Usage:
  command [options] [arguments]

Options:
  -h, --help                     Display this help message
  -q, --quiet                    Do not output any message
  -V, --version                  Display this application version
      --ansi                     Force ANSI output
      --no-ansi                  Disable ANSI output
  -n, --no-interaction           Do not ask any interactive question
      --profile                  Display timing and memory usage information
      --no-plugins               Whether to disable plugins.
  -d, --working-dir=WORKING-DIR  If specified, use the given directory as working directory.
  -v|vv|vvv, --verbose           Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  about           Short information about Composer.
  archive         Create an archive of this composer package.
  browse          Opens the package's repository URL or homepage in your browser.
  clear-cache     Clears composer's internal package cache.
  clearcache      Clears composer's internal package cache.
  config          Set config options.
  create-project  Create new project from a package into given directory.
  depends         Shows which packages cause the given package to be installed.
  diagnose        Diagnoses the system to identify common errors.
  dump-autoload   Dumps the autoloader.
  dumpautoload    Dumps the autoloader.
  exec            Execute a vendored binary/script.
  global          Allows running commands in the global composer dir ($COMPOSER_HOME).
  help            Displays help for a command
  home            Opens the package's repository URL or homepage in your browser.
  info            Show information about packages.
  init            Creates a basic composer.json file in current directory.
  install         Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json.
  licenses        Show information about licenses of dependencies.
  list            Lists commands
  outdated        Shows a list of installed packages that have updates available, including their latest version.
  prohibits       Shows which packages prevent the given package from being installed.
  remove          Removes a package from the require or require-dev.
  require         Adds required packages to your composer.json and installs them.
  run-script      Run the scripts defined in composer.json.
  search          Search for packages.
  self-update     Updates composer.phar to the latest version.
  selfupdate      Updates composer.phar to the latest version.
  show            Show information about packages.
  status          Show a list of locally modified packages.
  suggests        Show package suggestions.
  update          Updates your dependencies to the latest version according to composer.json, and updates the composer.lock file.
  validate        Validates a composer.json and composer.lock.
  why             Shows which packages cause the given package to be installed.
  why-not         Shows which packages prevent the given package from being installed.

می‌بینیم که این ابزار به درستی روی سیستم نصب شده است (لازم به ذکر است که پیش از نصب کامپوزر، از نصب PHP روی سیستم می‌بایست اطمینان حاصل کرده باشیم).

نصب کامپوزر روی ویندوز
ساده‌ترین راه برای نصب این ابزار روی سیستم‌عامل ویندوز، استفاده از اینستالر کامپوزر برای ویندوز است. با دانلود Composer-Setup.exe، این اینستالر آخرین ورژن کامپوزر را روی سیستم‌عامل شما نصب کرده و PATH را نیز تنظیم می‌کند و از آن پس به سادگی قادر خواهید بود تا با اجرای کامند composer از داخل هر فولدری، به استفاده از این ابزار بپردازید.

آشنایی با فایل composer.json
زمانی که شما می‌خواهید از این ابزار استفاده کنید، صرفاً نیاز به فایلی تحت عنوان composer.json خواهید داشت که دیپندنسی‌های پروژه‌ٔ شما + یکسری دیتای دیگر را شامل می‌گردد و کدهای قرار گرفته داخل این فایل چیزی شبیه به زیر است:

{
    "require": {
        "monolog/monolog": "1.0.*"
    }
}

در مثال فوق، قصد داریم لایبرری monolog که برای لاگ‌گیری پروژه استفاده می‌شود را نصب کنیم. همان‌طور که در کد فوق ملاحظه می‌شود، نیازمندی‌های پروژه در کلیدی تحت عنوان require آمده است. به عبارت دیگر، با مقادیری که ذیل require قرار می‌دهیم، به کامپوزر نشان می‌دهیم که پروژهٔ ما وابسته به چه وابستگی‌ها، لایبرری‌ها و حتی دیگر پروژه‌ها است.

در کلید require هم می‌بایست هر وابستگی را در خط مجزایی به صورت Key-Value بنویسیم. به طور مثال، در کد فوق گفته‌ایم که به لایبرری monolog/monolog نسخهٔ *.1.0 نیاز خواهیم داشت. از این پس، کامپوزر با استفاده از این داده‌ها به جستجو در ریپازیتوری‌هایی که مشخص‌ کرده باشید خواهد پرداخت (همان‌طور که در کد فوق ملاحظه می‌شود، هیچ‌گونه کلیدی مرتبط با repositories درج نشده است و در چنین شرایطی کامپوزر به صورت پیش‌فرض از سایت Packagist که پیش از این معرفی شد به عنوان ریپازیتوری پیش‌فرض استفاده خواهد کرد). به عبارت دیگر،‌ در مثال فوق کامپوزر فرض را بر این می‌گذارد که پروژهٔ monolog/monolog در سایت Packagist قبلاً ثبت شده است.

آشنایی با Package Name
به طور کلی، نام پکیج‌ها از دو بخش تشکیل شده است که بخش اول مرتبط با نام شرکت یا دولوپر سازندهٔ آن است و بخش دوم هم نام خود پکیج است. در مثال فوق، از آنجا که هم نام شرکت توسعه‌دهنده و هم نام خود پکیج یکی است، از ساختار monolog/monolog استفاده شده است (لازم به ذکر است که معمولاً هر دو نام یکی است و نام توسعه‌دهنده صرفاً به این خاطر ذکر می‌شود که با دیگر پکیج‌ها تداخل بوجود نیاید).

در واقع، این ساختار نام‌گذاری اجازه می‌دهد که دو شرکت یا دولوپر مختلف اقدام ساخت پکیج‌هایی با نام یکسان کنند. به عنوان مثال، دو دولوپر به نام‌های behzad و sahand می‌توانند پکیجی تحت عنوان todo طراحی کنند و این در حالی است که به ترتیب با نام کامل behzad/todo و sahand/todo به رسمیت شناخته خواهند شد و هرگز هم با یکدیگر به تداخل برنخواهند خورد.

آشنایی با Package Version
در مثال فوق، ما قصد داریم پکیجی تحت عنوان monolog/monolog با نسخهٔ *.1.0 را به پروژهٔ خود اضافه کنیم؛ در واقع، *.1.0 بدان معنا است که ما نیاز داریم تا نسخه‌ای از این لایبرری که می‌تواند چیزی مابین ۱.۰.۰ تا ۱.۰.۹ و کوچک‌تر از 1.1 باشد را دانلود کنیم.

فرایند نصب پکیج با استفاده از کامپوزر
به منظور نصب پکیج‌هایی که در فایل composer.json مشخص ساخته‌ایم، می‌بایست ابتدا از طریق کامندلاین وارد پوشهٔ پروژهٔ مد نظر شده سپس از دستور install استفاده نماییم:

$ composer install

فرض کنیم فولدر پروژهٔ مد نظر project نام دارد و داخل آن هم فایل composer.json با محتویاتی که در بالا به آنها اشاره شد قرار داده‌ایم. از طریق کامندلاین وارد مسیر این فولدر شده سپس دستور فوق را اجرا می‌کنیم که در این صورت چند اتفاق رخ خواهد داد. همان‌طور که در ادامه می‌بینیم، داخل پوشهٔ project دایرکتوری و فایل‌های زیر افزوده می‌شود:

vendor
composer.json
composer.lock

داخل پوشهٔ vendor هم خواهیم داشت:

composer
monolog
autoload.php

اگر این اولین باری است که کامند install را اجرا می‌کنیم، کامپوزر تمامی وابستگی‌هایی که در فایل composer.json لیست شده‌اند را دانلود کرده و داخل پوشه‌ای تحت عنوان vendor می‌ریزد (vendor نام پوشهٔ پیش‌فرض لایبرری‌های به اصطلاح Third-party است). همچنین اگر خود لایبرری monolog/monolog به وابستگی‌های دیگر برای اجرا نیاز داشته باشد، آنها هم در پوشهٔ vendor نصب خواهند شد (به خاطر داشته باشیم که اگر از سیستم‌های ورژن کنترلی همچون Git استفاده می‌کنیم، می‌بایست مسیر پوشهٔ vendor را داخل فایلی تحت عنوان gitignore. بیفزاییم چرا که افزودن فایل‌های لایبرری‌های قرار گرفته در این پوشه به ریپازیتوری گیت اصلاً ضروری نداشته و صرفاً فضا را اشغال می‌کند و هر دولوپر دیگری که بخواهد روی پروژهٔ ما کار کند، به سادگی قادر خواهد بود تا سورس‌کدهای اختصاصی ما را از گیت دریافت کرده و سپس با استفاده از کامپوزر وابستگی‌های مورد نیاز را دانلود کند و پروژه را تکمیل سازد).

پس از اتمام فرایند دانلود وابستگی‌ها، نرم‌افزار کاپوزر فایلی تحت عنوان composer.lock را داخل ریشهٔ پروژه ایجاد کرده و کلیهٔ داده‌های مرتبط با تمامی پکیج‌ها و نسخهٔ دقیق آنها داخل این فایل ثبت می‌کند. به عبارت دیگر، پروژه روی دقیقاً وابستگی‌های ثبت شده قفل می‌گردد و به نوعی پروژه فقط و فقط با آن وابستگی‌ها کار خواهد کرد. در واقع، اگر گروهی از دولوپرهای PHP روی پروژه‌ای یکسان کار می‌کنند، دولوپر اصلی پروژه می‌بایست فایل composer.lock را روی گیت بفرستند تا دیگر دولوپرها را ملزم کند تا دقیقاً با دیپندنسی‌های مد نظرش پروژه را اجرا کنند.

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

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

$ composer update

در واقع، دستور composer update آخرین نسخه‌ از پکیج‌های مورد نیاز پروژه را که سازگار با نسخه‌های درج شده در فایل composer.json باشند را از ریپازیتوری‌ها دریافت کرده و داخل پروژه نصب می‌کند و همچنین فایل composer.lock را هم آپدیت کرده و نسخه‌‌های جدید دانلود شده را داخل آن درج می‌کند. به یاد داشته باشیم که کامند فوق کلیهٔ وابستگی‌های یک پروژه را آپدیت می‌کند و این در حالی است که اگر بخواهیم صرفاً یک پکیج به خصوص را آپدیت کنیم، حتماً می‌بایست نام پکیج یا لایبرری را به عنوان آپشن کامند update در نظر بگیریم:

$ composer update monolog/monolog

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

آشنایی با مفهوم Autoloading
برای لایبرری‌هایی همچون monolog، نرم‌افزار کامپوزر همان‌طور که در بالا مشاهده شد در داخل پوشهٔ vendor فایلی تحت عنوان autoload.php ایجاد می‌کند و این در حالی است که به سادگی قادر خواهیم بود تا این فایل را هر کجا که تمایل به استفاده داشتیم اصطلاحاً require کرده و از آن پس از کلیهٔ کلاس‌های این لایببری در سایر فایل‌ها استفاده نماییم:

require __DIR__ . '/vendor/autoload.php';

$log = new Monolog\Logger('name');
$log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Logger::WARNING));
$log->addWarning('Foo');

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

حال نوبت به نظرات شما می‌رسد. در حین استفاده از این ابزار، با چه چالش‌هایی مواجه شده‌اید؟ نظرات، دیدگاه‌ها و تجربیات خود از کار با این ابزار را با ما و سایر کاربران سکان آکادمی به اشتراک بگذارید.



بهزاد مرادی