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

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