کامپوزر چیست؟ آشنایی و روش کار آن

آشنایی با کامپوزر - روش کار با آن و توضیحاتی در خصوص کامپوزر
آشنایی با کامپوزر - روش کار با آن و توضیحاتی در خصوص کامپوزر

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

کامپوزر Composer در ابتدای ماه مارس سال ۲۰۱۲ به صورت رایگان توسط Nils Adermann و Jordi Boggiano با الهام از NPM و Bundler توسعه داده شد و تاکنون استقبال بسیار خوبی از این ابزار از طرف برنامه‌نویسان زبان برنامه‌نویسی PHP صورت گرفته است. به طور خلاصه، کامپوزر یک ابزار کامندلاین است که در آن با استفاده از یکسری دستورات از پیش تعریف شده می‌توان به مدیریت منابع خارجی پرداخت.

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

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

نصب کامپوزر به صورت 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 و ابزار cURL روی سیستم باید اطمینان حاصل کرد.)

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

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

{
    &quotrequire&quot: {
        &quotmonolog/monolog&quot: &quot1.0.*&quot
    }
}

در مثال فوق، قصد داریم لایبرری 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.0.0 تا 1.0.9 و کوچک‌تر از 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 می‌ریزد که نام پوشهٔ پیش‌فرض لایبرری‌های به اصطلاح Third-party است مضاف بر اینکه اگر خود لایبرری monolog/monolog به وابستگی‌های دیگری برای اجرا نیاز داشته باشد، آن‌ها هم در این پوشه نصب خواهند شد.

به خاطر داشته باشیم که اگر از سیستم‌های ورژن کنترلی همچون Git استفاده می‌کنیم، باید مسیر پوشهٔ vendor را داخل فایلی تحت عنوان gitignore. بیفزاییم چرا که افزودن فایل‌های لایبرری‌های قرار گرفته در این پوشه به ریپازیتوری گیت اصلاً ضرورتی نداشته و صرفاً فضا را اشغال می‌کنند و هر دولوپر دیگری که بخواهد روی پروژهٔ ما کار کند، به سادگی قادر خواهد بود تا سورس‌کدهای اختصاصی ما را از سیستم ورژن کنترل دریافت کرده و سپس با استفاده از کامپوزر، وابستگی‌های مورد نیاز را دانلود کند و پروژه را تکمیل سازد.

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

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

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

$ composer update

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

$ 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');

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