آهنگساز php چیست؟ نصب Composer برای Dummies (راه اندازی و دستورات اولیه)

) یک مدیر وابستگی نسبتا جدید و در حال حاضر بسیار محبوب برای PHP است. شما می توانید توضیح دهید که پروژه شما به کدام کتابخانه ها بستگی دارد و Composer کتابخانه های لازم را برای شما نصب خواهد کرد! علاوه بر این، Composer یک مدیر بسته به معنای کلاسیک نیست. بله، با موجودیت‌هایی کار می‌کند که ما آن‌ها را «بسته‌ها» یا کتابخانه‌ها می‌نامیم، اما آنها در داخل هر پروژه به طور جداگانه نصب می‌شوند و نه به صورت سراسری (این یکی از تفاوت‌های اصلی با PEAR خوب قدیمی است).

به طور خلاصه چگونه کار می کند:

  1. شما پروژه ای دارید که به چندین کتابخانه بستگی دارد.
  2. برخی از این کتابخانه ها به کتابخانه های دیگر وابسته هستند.
  3. در پروژه خود، آن دسته از کتابخانه هایی را که کد شما مستقیماً به آنها بستگی دارد، توصیف می کنید.
  4. Composer نسخه های مناسب کتابخانه های مورد نیاز برای کل پروژه را پیدا می کند، آنها را دانلود می کند و در پوشه پروژه شما نصب می کند.
هنگام خلق Composer، نویسندگان ایده ها و الهامات خود را از آن استخراج کردند پروژه های مشابه: npm برای Node.js و Bundler برای Ruby.

این پروژه در ابتدا توسط دو نفر Nils Adermann و Jordi Boggiano طراحی و توسعه داده شد، در حال حاضر بیش از بیست مشارکت کننده در این پروژه وجود دارد.

اولین commit ها در آوریل 2011 انجام شد و امروز Composer در مرحله "alpha3" قرار دارد. با این حال، در حال حاضر کاملاً پایدار است و توسط بسیاری از پروژه های محبوب PHP استفاده می شود (به عنوان مثال، سیمفونی 2). فهرستی از پروژه‌هایی که از Composer استفاده می‌کنند را می‌توانید در وب‌سایت packagist.org پیدا کنید - این مخزن رسمی بسته‌های Composer است. به هر حال، در کنفرانس اخیر Devconf 2012، توسعه دهنده چارچوب Yii در گزارش خود اشاره کرد که Yii2به احتمال زیاد از Composer نیز استفاده خواهد کرد.

در این مقاله به طور خلاصه ویژگی های اصلی Composer را شرح می دهم و سعی می کنیم یک پروژه آزمایشی ایجاد کنیم که از Composer برای بارگذاری کتابخانه های لازم استفاده کند. همه نمونه ها در github.com و bitbucket.org در دسترس خواهند بود.

Composer چه کاری می تواند انجام دهد؟

  • دانلود بسته ها و وابستگی های آنها؛
  • به طور پیش فرض، بسته ها از مخزن رسمی packagist.org دانلود می شوند. هر کس می تواند آزادانه بسته خود را در آنجا اضافه کند تا نصب آن را تا حد امکان آسان و راحت برای کل جهان انجام دهد.
  • بسته ها را می توان نه تنها از packagist.org، بلکه از هر مخزن git، mercurial یا svn دانلود کرد.
  • هنگام دانلود بسته ها از github.com یا bitbucket.org، هیچ سیستم کنترل نسخه نصب شده (git یا hg) مورد نیاز نیست، Composer از طریق API این سایت ها کار می کند.
  • مخزن git/hg/svn با یک بسته را می توان نه تنها در یکی از سایت های ذکر شده در بالا، بلکه در هر مکان دیگری، به عنوان مثال، در شبکه محلیسازمانی یا حتی روی هارد دیسک محلی؛
  • علاوه بر این، کتابخانه ای که باید نصب شود لازم نیست به شکل یک بسته Composer باشد که می توانید از هر مخزن git/hg/svn هر ساختاری نصب کنید.
  • در نهایت، بسته ای که قرار است نصب شود لازم نیست یک مخزن git/hg/svn باشد، می تواند یک فایل فشرده دلخواه در هر uri باشد!
  • همه بسته ها در دایرکتوری فعلی نصب شده اند (از جایی که دستور install اجرا شده است)، این به شما امکان می دهد چندین نسخه های مختلفکتابخانه ها هنگام کار بر روی پروژه های مختلف به صورت موازی.
  • دستور به روز رسانی تمام بسته های نصب شده (یا به طور تصادفی حذف شده را دوباره نصب می کند) به آخرین نسخه ها به روز می کند. یا اگر یک فایل composer.lock ویژه ایجاد می‌کنید، ممکن است نیازی به به‌روزرسانی نسخه‌ها به آخرین نسخه‌ها نباشد - این به شما امکان می‌دهد ترکیبی از نسخه‌های پایدار همه کتابخانه‌های مورد استفاده در پروژه را تعمیر کنید.
  • پس از نصب بسته ها، autoload.php به صورت خودکار تولید می شود که با آن می توانید کتابخانه های نصب شده را در کد پروژه خود متصل کنید. هنگام تهیه پکیج Composer، توصیه می شود از PSR-0 - استانداردی برای مکان و نامگذاری فایل های PHP استفاده کنید تا بارگذاری خودکار بتواند به راحتی آنها را پیدا کند. در هر صورت، نویسنده بسته می‌تواند قوانینی را شرح دهد که بارگذاری خودکار فایل‌های کلاس‌ها یا فضاهای نام خاص را جستجو می‌کند. اگر کتابخانه ای را نصب کنید که به عنوان بسته Composer بسته بندی نشده است (به عنوان مثال، یک مخزن git سفارشی از github)، وظیفه توصیف قوانین بارگذاری خودکار بر دوش شما می افتد. بنابراین هیچ جادوی با autoload.php تولید شده وجود ندارد - می تواند همه چیز را بارگیری کند (حتی کتابخانه هایی با مجموعه ای از توابع خارج از کلاس ها)، نکته اصلی این است که قوانین (توسط نویسنده کتابخانه یا توسط شما) شرح داده شوند.

مثال کاری: استفاده از Composer در پروژه ما

برای اینکه بفهمیم چگونه از Composer استفاده کنیم، یک پروژه کوچک در PHP می نویسیم: "Super Hello World" از آنجایی که نمی خواهیم چرخ را دوباره اختراع کنیم و از ابتدا کد بنویسیم، کتابخانه ها و فریم ورک های آماده را می گیریم. .

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

  1. میکروفریمورک Silex
  2. موتور قالب Twig (موجود به عنوان یک بسته Composer در packagist.org)،
  3. ثبت کننده بازدید خودمان SuperLogger، که من به عنوان یک بسته Composer طراحی کردم و در github منتشر کردم
  4. superlib کتابخانه قدیمی قدیمی اما محبوب ما، که از ترکیبی از کلاس‌های بدون فضای نام و توابع بدون کلاس تشکیل شده است. این کتابخانه در github منتشر شده است، اما یک بسته Composer نیست
قبلاً چگونه این کار را انجام دادیم: چارچوب‌ها و کتابخانه‌های مورد نیاز خود را دانلود کردیم، به این فکر کردیم که کجا آن‌ها را باز کنیم، مجموعه‌ای از require (یا require_once برای قابلیت اطمینان) را در پروژه نوشتیم.

اکنون چگونه این کار را انجام خواهیم داد: ما از Composer استفاده می کنیم - تمام کتابخانه ها را دانلود می کند و autoload.php را برای ما ایجاد می کند. علاوه بر این، اگر بخواهیم "Super Hello World" را به همکاران خود نشان دهیم، کافی است کد پروژه خود را در github (یا جای دیگری) بدون گنجاندن تمام کتابخانه های مورد نیاز در مخزن و بدون تهیه دستورالعمل های طولانی منتشر کنیم. برای نصب آنها همکاران ما فقط باید "Super Hello World" را دانلود کنند (کلون کنند) و دستور را اجرا کنند
php composer.phar نصب کنید
آهنگساز به صورت یک فایل واحد توزیع می شود composer.phar(phar یک بایگانی php است) - در اصل یک اسکریپت PHP است که می تواند چندین دستور (نصب، به روز رسانی، ...) را بپذیرد و می تواند کتابخانه ها را دانلود و باز کند.

به هر حال، کمی در مورد نحو راه اندازی.
اگر از ویندوز استفاده می کنید، به احتمال زیاد چیزی شبیه به آن خواهید نوشت
php C:\path\to\composer.phar نصب کنید
می‌توانید با ایجاد composer.bat و قرار دادن آن در %PATH، زندگی خود را آسان‌تر کنید.

در لینوکس و OS X، می توانید دستوری مانند پیکربندی کنید
آهنگساز نصب کنید

composer.json
بنابراین، ما آماده نوشتن پروژه Super Hello World خود هستیم. و من فقط آن را نوشتم: http://github.com/pqr/superhelloworld. کد شامل یک فایل index.php در فهرست وب و یک الگوی layout.twig در دایرکتوری views است.

سر همه چیز پرونده است composer.json. باید در ریشه پروژه باشد، در مورد ما در کنار وب و مشاهده دایرکتوری ها. در این فایل باید مشخص کنیم که پروژه ما به کدام کتابخانه ها بستگی دارد. علاوه بر این، اگر این کتابخانه ها بسته های Composer نیستند، باید تعدادی را مشخص کنید اطلاعات تکمیلیدرباره کتابخانه در حال نصب (به عنوان مثال، قوانین بارگیری خودکار کلاس ها و توابع برای autoload.php را شرح دهید).

همانطور که حدس زدید Composer.json دارای فرمت داده JSON است. به سوال " چرا JSON"توسعه دهندگان آهنگساز پاسخ می دهند" زیرا. فقط قبول کن".

ما باید یک شی js ​​را توصیف کنیم که حاوی تمام دستورالعمل ها باشد. اولین و بیشترین دستورالعمل های اصلی: نیاز.

ما بسته ها را از packagist.org متصل می کنیم
( "نیاز": ( "php":">=5.3.0، "silex/silex":"dev-master"، "twig/twig":">=1.8،<2.0-dev" } }
در اینجا وابستگی پروژه به PHP نسخه 5.3.0 و بالاتر، به silex (microframework) و به twig (موتور قالب) را توضیح دادم. Silex و Twig به عنوان بسته های Composer در packagist.org در دسترس هستند، بنابراین نیازی به تنظیمات اضافی ندارند. توجه می کنم که Silex به نوبه خود به چندین بسته دیگر بستگی دارد - همه آنها به طور خودکار دانلود و نصب می شوند.

نام بسته شامل دو قسمت است که با یک اسلش از هم جدا شده اند: نام تامین کننده(نام فروشنده) و نام کتابخانه ها. نام تامین کننده اغلب نام مستعار نویسنده یا نام شرکت است. گاهی اوقات، نام فروشنده با نام خود کتابخانه یا چارچوب یکسان است.

برای هر بسته، باید یک شماره نسخه را مشخص کنید. این می تواند یک شاخه در مخزن باشد، به عنوان مثال، "dev-master" - پیشوند dev نشان می دهد که این نام شعبه است، و بر این اساس خود شاخه "master" نامیده می شود. برای یک مخزن جیوه ای، ورودی مشابه شبیه "dev-default" خواهد بود. همچنین می توانید قوانین پیچیده تری را به عنوان شماره نسخه با استفاده از عملگرهای مقایسه مشخص کنید. به هر حال، اگر کد را از یک مخزن راه دور دانلود کنید، Composer برچسب ها و نام شاخه ها را در آن مخزن برای چیزی شبیه به شماره نسخه اسکن می کند، به عنوان مثال تگ "v1.2.3" به عنوان اشاره گر به نسخه 1.2.3 استفاده می شود. .

ما به بسته Compsoer خودمان متصل می شویم
در مرحله بعد، بیایید بسته SuperLogger خودمان را که به درستی قالب بندی شده است، اما نه در packagist.org، بلکه در github منتشر شده است، وصل کنیم:
( "نیاز": ( "php":">=5.3.0، "silex/silex":"dev-master"، "twig/twig":">=1.8،<2.0-dev", "mycompany/superlogger":"dev-master" }, "repositories":[ { "type":"git", "url":"http://github.com/pqr/superlogger" } ] }
برای اینکه Composer بداند کجا باید بسته "mycompany/superlogger" را جستجو کند، یک آرایه اضافه کردیم مخازنبا پیوند به مخزن github مربوطه. لطفاً توجه داشته باشید که ورودی‌های آرایه مخازن به هیچ وجه مستقیماً با بلوک مورد نیاز مرتبط نیستند - مطابقت بین بسته‌ها و مخازن مشخص نشده است. تا آنجا که من متوجه شدم، Composer تمام بسته های مورد نیاز را در تمام مخازن مشخص شده (از جمله در وب سایت packagist.org) جستجو می کند و مطابق برخی از اولویت های داخلی، موارد مشابه را دانلود می کند. من هنوز این نکته را عمیق‌تر درک نکرده‌ام، اگر کسی جزئیات را می‌داند تصحیح کنید.
یک مخزن git دلخواه را وصل کنید
اکنون اجازه دهید superlib کتابخانه قدیمی خود را که در github است، اما یک بسته Composer رسمی نیست، وصل کنیم، زیرا او بسیار پیر است
( "require":( "php":">=5.3.0، "silex/silex":"dev-master"، "twig/twig":">=1.8،<2.0-dev", "mycompany/superlogger":"dev-master", "pqr/superlib":"1.2.3" }, "repositories":[ { "type":"git", "url":"http://github.com/pqr/superlogger" }, { "type":"package", "package":{ "name":"pqr/superlib", "version":"1.2.3", "source":{ "type":"git", "url":"http://github.com/pqr/superlib", "reference":"master" }, "autoload":{ "classmap":["timer.php"], "files":["lib_functions.php"] } } } ] }
یک شی به آرایه مخازن اضافه شده است که بسته pqr/superlib را به طور کامل توصیف می کند. اساساً، این توصیفی است که نویسنده کتابخانه باید انجام دهد و در مخزن خود قرار دهد. اما طبق شرایط کار، superlib یک بسته Composer رسمی نیست، بنابراین ما مجبور شدیم توضیحات آن را به عنوان بخشی از پروژه Super Hello World ایجاد کنیم. به روشی مشابه، می توانید هر کتابخانه دیگری را متصل کنید. فایل فشرده ساده
یک فایل فشرده ساده را وصل کنید
به عنوان مثال، شرح وابستگی به موتور قالب Smarty، که به صورت یک فایل فشرده با منابع در svn توزیع شده است، ممکن است به این صورت باشد:
( "Repositories":[ ( "type":"package", "package":( "name":"smarty/smarty", "version":"3.1.7", "dist":( "url":" http://www.smarty.net/files/Smarty-3.1.7.zip، "type":"zip"، "source":( "url":"http://smarty-php.googlecode. com /svn/، "type":"svn"، "reference":"tags/Smarty_3_1_7/distribution/" ) ) ) ]، "require":( "smarty/smarty":"3.1.*" ))
دستورالعمل بارگذاری خودکار
بیایید به پروژه خود برگردیم.
هنگام توصیف "pqr/superlib"، دستورالعمل ها را اضافه کردیم بارگذاری خودکار. فایل timer.php را مشخص می کند، که در آن autoloader آینده به دنبال کلاس ها خواهد بود، و یک فایل با توابع lib_functions.php را مشخص می کند - در ابتدای autoload.php مجبور می شود متصل شود.

بنابراین، پروژه ما شامل موارد زیر است:

  • در ریشه یک فایل composer.json وجود دارد.
  • دایرکتوری های وب و views در ریشه قرار دارند.
  • در داخل فهرست وب فایلی با "منطق تجاری" برنامه ما وجود دارد: index.php;
  • داخل دایرکتوری views یک فایل قالب layout.twig وجود دارد.
  • علاوه بر این، من .htaccess (برای apache) و web.config (برای IIS 7.5) را با قوانین mod_rewrite/url rewriter در پوشه وب قرار دادم - آنها هیچ ارتباطی مستقیم با پیکربندی Composer ندارند.
همه چیز برای رفتن آماده است.
نصب composer را اجرا کنید
php composer.phar نصب کنید
Composer مخازن را شبیه سازی می کند و آنها را در نسخه مورد نظر در یک فهرست باز می کند فروشنده، که خود او در ریشه پروژه ایجاد می کند. پس از باز کردن بسته بندی، در فهرست فروشنده خواهیم یافت:
  • فایل autoload.php
  • Service Directories.composer و composer
  • pimple - بسته ای که همراه با microframework Silex توسعه یافته است
  • silex خود microframework است، ما به صراحت آن را هنگام توصیف وابستگی ها درخواست کردیم
  • symfony - برخی از اجزای Symfony 2 که برای کار Silex مورد نیاز است
  • twig یک موتور قالب است که ما نیز صریحاً آن را درخواست کرده ایم
  • mycompany - در داخل این دایرکتوری یک مخزن superlogger وجود دارد که از github دانلود شده است
  • pqr - در داخل این دایرکتوری یک مخزن superlib وجود خواهد داشت که از github نیز دانلود شده است
تنها چیزی که باقی می ماند این است که autoload.php را در ابتدای فایل web/index.php قرار دهید (نیاز به "../vendor/autoload.php" است) و تمام کتابخانه ها و توابع در دسترس خواهند بود!
چگونه پکیج Composer خود را بسازیم؟
در این پروژه از Composer از دیدگاه مصرف کننده کتابخانه استفاده کردیم. چگونه می توانید خودتان یک پکیج Composer ایجاد کنید تا دیگران بتوانند از آن استفاده کنند؟

در واقع من یکی از این بسته ها را هنگام تهیه نمونه های این مقاله ایجاد کردم. در ریشه مخزن superlogger یک فایل composer.json با ساختاری مشابه وجود دارد که خود بسته و وابستگی های آن را توصیف می کند (در مورد superlogger هیچ وابستگی وجود ندارد). نمونه های دیگر: مخازن silex و twig که در پوشه vendor دانلود شده اند - همه آنها یک فایل composer.json در ریشه دارند - نگاه کنید، مطالعه کنید!

و البته، اسناد موجود در وب سایت رسمی getcomposer.org/doc/ را فراموش نکنید.
این تاپیک رو میذارم که خودتون مطالعه کنید.

بیایید آن را جمع بندی کنیم

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

وقت آن است که آن را امتحان کنید!

  1. دانلود آهنگساز (getcomposer.org/download/)
  2. دانلود superhelloworld (git clone git://github.com/pqr/superhelloworld.git)
  3. نصب وابستگی ها (cd superhelloworld && php composer.phar install)
  4. پوشه فروشنده ظاهر شده و autoload.php ایجاد شده را بررسی کنید
  5. از Composer در پروژه های خود استفاده کنید
  6. سود!!!

چند لینک برای اضافه کردن

Composer یک مدیر وابستگی برای PHP (مدیر وابستگی برای PHP) یا یک مدیر بسته است (وابستگی‌ها بسته‌ها هستند - به طور منطقی توسعه‌های شخص ثالث یا اختصاصی کامل مورد استفاده در پروژه).

بهتر است جهانی نصب شود. برای OSX در ترمینال وارد می کنیم

Curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer

آهنگساز

اگر همه چیز درست باشد، لیستی از دستورات را مشاهده خواهید کرد. بنابراین می توانید از آهنگساز استفاده کنید.

1. چگونه یک پروژه جدید در آهنگساز ایجاد کنیم؟

Composer همه وابستگی‌ها را در فایل composer.json ذخیره می‌کند، بنابراین این سوال مطرح می‌شود که "چرا JSON؟" توسعه دهندگان Composer با "زیرا. فقط آن را بپذیر" پاسخ می دهند.

با دستور می توانید این فایل را بسازید

Composer init (یا php composer.phar init)

آهنگساز شما را از طریق چندین مرحله راهنمایی می کند - نام پروژه، توضیحات، مجوز. مرحله مهم برای شما جایی است که آهنگساز از شما می خواهد بسته ای را که می خواهید نصب کنید را مشخص کنید. جستجوی یک بسته را پیشنهاد می کند، جایی که برای مثال "yii" را وارد می کنید و جستجو همه بسته های yii را در packagist.org ارائه می دهد. پس از انتخاب آنچه شما نیاز دارید، composer یک فایل composer.json را در پوشه پروژه شما با تمام وابستگی های توصیف شده ایجاد می کند.

اکنون تنها چیزی که باقی می ماند این است که آنها را با دستور نصب کنید:

آهنگساز نصب کنید

همه. اکنون هر چیزی که می خواستید دانلود کنید در پروژه شما ظاهر شده است.

2. چگونه با استفاده از composer از یک پکیج آماده پروژه ایجاد کنیم؟

این کار با دستور create-project ("ایجاد پروژه جدید از یک بسته در پوشه داده شده.") در پوشه ای که می خواهید پوشه پروژه را ایجاد کنید انجام می شود.

به عنوان مثال، اجازه دهید یک بسته پیشرفته برای یک برنامه کاربردی در yii2 (https://packagist.org/packages/yiisoft/yii2-app-advanced) بگیریم. بنابراین این بسته در packagist.org آپلود شد.

Composer create-project yiisoft/yii2-app-advanced yii2advanced 2.0.0-بتا

yii2advanced - نام پروژه خود را نشان دهید (پوشه در رایانه شما)
2.0.0-بتا - نسخه (نگاه کنید چه نسخه هایی در packagist.org موجود است)

پس از این دستور، composer بسته را دانلود می‌کند و تمام وابستگی‌ها را برای آن نصب می‌کند (لازم نیست به دنبال پسوندهای لازم در سایت‌های مختلف بگردید - composer خودش آنها را پیدا می‌کند).

3. بسته را به روز کنید.

تیم

(وابستگی های شما را مطابق composer.json به آخرین نسخه به روز می کند و فایل composer.lock را به روز می کند.) - همه بسته های نصب شده (یا نصب مجدد تصادفی حذف شده) را به آخرین نسخه ها به روز می کند. یا اگر یک فایل composer.lock ویژه ایجاد می‌کنید، ممکن است نیازی به به‌روزرسانی نسخه‌ها به آخرین نسخه‌ها نباشد - این به شما امکان می‌دهد ترکیبی از نسخه‌های پایدار همه کتابخانه‌های مورد استفاده در پروژه را تعمیر کنید.

در تصویر، به روز رسانی برای من رخ نمی دهد، زیرا همه وابستگی ها مرتبط هستند.

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

نصب جهانی

اگرچه این گزینه به وضوح در مستندات توضیح داده شده است، Composer می تواند (و در بیشتر موارد باید) به صورت سراسری نصب شود. نصب جهانی به این معنی است که به جای:

Php composer.phar somecommand
در هر پروژه ای به سادگی می توانید وارد کنید:

آهنگساز یک فرمان
این امر ایجاد پروژه های جدید را بسیار آسان می کند (مثلاً با استفاده از دستور ایجاد-پروژه) در هر نقطه از سیستم فایل شما.

برای نصب Composer به صورت سراسری، این دستورالعمل ها را دنبال کنید.

نصب صحیح وابستگی ها

هنگام خواندن دستورالعمل های مقدماتی یا فایل های README، بسیاری برای شما چیزی شبیه به:
فقط موارد زیر را به composer.json خود اضافه کنید فایل:
("require": ("myproject": "someversion"))

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

بهترین راه برای افزودن یک وابستگی جدید به یک فایل composer.json- این برای استفاده از دستور است نیاز:

آهنگساز به somepackage/somepackage:someversion نیاز دارد
این کار همه چیز مورد نیاز را بدون دخالت دستی به فایل وابستگی اضافه می کند.

اگر نیاز به اضافه کردن بسته ها به بخش دارید require-dev، گزینه را به دستور اضافه کنید --dev:

آهنگساز به phpunit/phpunit --dev نیاز دارد
همچنین، تیم نیازاز افزودن چندین بسته به طور همزمان پشتیبانی می کند، فقط آنها را با فاصله جدا کنید.

قفل کردن فایل ها

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

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

نسخه سازی

هنگام تعیین نسخه های بسته معتبر، می توانید از تطابق دقیق ( 1.2.3 ، محدوده با عملگرهای مقایسه ( <1.2.3 ترکیبی از این عملگرها ( >1.2.3 <1.3 )، "آخرین در دسترس" ( 1.2.* )، کاراکتر تایلد ( ~1.2.3 ) و کرت ( ^1.2.3 ).

دو دستورالعمل آخر شایسته توضیح جداگانه هستند:

  • نشانگر تار و مد ( ~1.2.3 ) شامل تمام نسخه های تا 1.3 (شامل نیست)، زیرا در نسخه سازی معنایی این لحظه معرفی عملکرد جدید است. در این صورت آخرین نسخه مینور پایدار به دست می آید. همانطور که مستندات بیان می کند، با این نشانه، فقطآخرین رقم نسخه
  • مشخص کردن کارت ( ^1.2.3 ) در لغت به معنای "فقط از شکستن تغییرات مراقب باشید" و شامل نسخه های تا 2.0 . در رابطه با semver، تغییر نسخه اصلی لحظه ای است که تغییرات قطعی در پروژه ایجاد می شود، بنابراین نسخه ها 1.3 , 1.4 و 1.9 در حالی که مناسب است 2.0 - دیگر نه.
توصیه می کنم همیشه از قالب استفاده کنید، مگر اینکه بدانید به نسخه خاصی از یک بسته نیاز دارید ~1.2.3 مطمئن ترین انتخاب است

پیکربندی محلی و جهانی

مقادیر پارامتر پیش فرض در سنگ تنظیم نشده است. شرح دقیق پارامترهای پیکربندی ممکن ( پیکربندی) لینک را ببینید.

به عنوان مثال، با مشخص کردن:
("config": ("optimize-autoloader": درست))
شما Composer را مجبور می کنید که پس از نصب یا به روز رسانی بسته (یا به عبارت دیگر، هر بار که یک فایل بارگیری خودکار کلاس ایجاد می شود) کلاس مپ را بهینه کند. این کمی کندتر از ایجاد خودکار بارگذاری پیش‌فرض است و با رشد پروژه کندتر می‌شود.

یکی دیگر از پارامترهای مفید می تواند باشد cache-files-maxsize. در پروژه های بزرگ (مانند eZ Publish یا Symfony) حافظه پنهان می تواند به سرعت پر شود. افزایش اندازه حافظه نهان به Composer اجازه می دهد تا برای مدت طولانی تری سریع اجرا شود.

لطفاً توجه داشته باشید که پارامترهای پیکربندی را می توان به صورت سراسری تنظیم کرد، در این صورت آنها بر همه پروژه ها تأثیر خواهند گذاشت (به پیکربندی مراجعه کنید). به عنوان مثال، برای تنظیم جهانی پارامتر اندازه کش، باید فایل را ویرایش کنید ~/.composer/config.json، یا اجرا کنید:

پیکربندی Composer -- cache global-files-maxsize "2048MiB"

نمایه سازی و خروجی پرمخاطب (کلمه)

اگر پارامتر را اضافه کنید --مشخصاتبه هر دستوری هنگام استفاده از Composer در خط فرمان، خروجی شامل چیزی بیش از نتیجه نهایی خواهد بود، به عنوان مثال:

میزان مصرف حافظه: 174.58 مگابایت (پیک: 513.47 مگابایت)، زمان: 54.7 ثانیه
اما همچنین زمان اجرای دستور و اندازه حافظه مورد استفاده را به ابتدای هر خط خروجی اضافه می کند:

نصب دارایی برای Sensio\Bundle\DistributionBundle در web/bundles/sensiodistribution
من از این گزینه برای شناسایی بسته های "آهسته" و نظارت بر بهبود یا کاهش عملکرد در .

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

منابع کاربر

اگر پروژه شما هنوز در Packagist نیست، گاهی اوقات فقط نیاز به نصب یک بسته از GitHub دارید (به عنوان مثال، اگر بسته هنوز در حال توسعه است). برای انجام این کار، راهنمای ما را ببینید.

وقتی دارید آننسخه بسته محبوبی که پروژه شما به آن وابسته است، می توانید از ریشه های سفارشی در ترکیب با نام مستعار درون خطی استفاده کنید تا شاخه خود را جایگزین بسته عمومی کنید، مانند Matthieu Napoli.

افزایش سرعت آهنگساز

با استفاده از یک روش عالی توصیف شده توسط Mark Van Eijk، می توانید اجرای Composer را با فراخوانی آن از طریق HHVM سرعت بخشید.

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

کاهش اندازه پروژه آهنگساز

اگر توسعه دهنده پروژه های Composer Friendly هستید، این قسمت نیز شما را مورد توجه قرار خواهد داد. با توجه به این پست در Reddit، می توانید از فایل استفاده کنید .gitattributesهنگام بسته بندی یک بسته برای حالت، برخی از فایل ها و پوشه ها را نادیده بگیرید -- ترجیح دادن-دیست.
/docs export-ignore /tests export-ignore /.gitattributes export-ignore /.gitignore export-ignore /.travis.yml export-ignore /phpunit.xml export-ignore
چگونه کار می کند؟ هنگامی که پروژه ای را در GitHub آپلود می کنید، به طور خودکار پیوند را در دسترس قرار می دهد “دانلود فایل فشرده”، که با آن می توانید آرشیو پروژه خود را دانلود کنید. علاوه بر این، Packagist از این آرشیوهای تولید شده به طور خودکار برای دانلود وابستگی ها با این گزینه استفاده می کند -- ترجیح دادن-دیست، که سپس به صورت محلی از حالت فشرده خارج می شود (بسیار سریعتر از شبیه سازی فایل های منبع پروژه). اگر به .gitattributesآزمایش‌ها، اسناد و فایل‌های دیگری که به منطق پروژه مربوط نمی‌شوند، این آرشیوها حاوی آنها نیستند و بسیار سبک‌تر می‌شوند.

در عین حال افرادی که خواستنبرای اشکال زدایی کتابخانه یا اجرای تست ها، باید یک پارامتر مشخص کنید -- ترجیح منبع.

PhpLeague این رویکرد را اتخاذ کرده و آن را در خود گنجانده است "اسکلت بسته"(اسکلت بسته)، بنابراین هر پروژه ای بر اساس آن به طور خودکار خواهد بود “دوستانه از راه دور”.

نمایش دهید

اگر به طور ناگهانی فراموش کردید که از کدام نسخه PHP یا افزونه های آن استفاده می کنید، یا به لیستی از تمام پروژه های نصب شده (با شرح هر کدام) با نسخه های آنها نیاز دارید، می توانید از دستور استفاده کنید. نشان می دهدبا پارامترها --سکو () و --نصب شده است (-من):

آهنگساز نمایش --نصب شده است

$ composer show --نصب شده behat/behat v3.0.15 چارچوب BDD سناریو گرا برای PHP 5.3 behat/gherkin v4.3.0 تجزیه کننده Gherkin DSL برای PHP 5.3 behat/mink v1.5.0 چارچوب تست پذیرش وب برای PHP 5.3 behat/mink -driver v1.1.0 Symfony2 BrowserKit driver for Mink Framework behat/mink-extension v2.0.1 افزونه Mink برای Behat behat/mink-goutte-driver v1.0.9 درایور Goutte برای چارچوب Mink behat/mink-sahi-driver v1.1.0 Sahi. درایور JS برای Mink Framework behat/mink-selenium2-driver v1.1.1 Selenium2 (WebDriver) درایور برای Mink Framework behat/sahi-client dev-master ce7bfa7 کلاینت Sahi.js برای PHP 5.3 behat/symfony2-extension v2.0.0 افزونه Symfony2 برای Behat behat/transliterator v1.0.1 کامپوننت‌های نویسه‌نویس رشته‌ای/بوت‌استرپ 3.3.2 محبوب‌ترین فریم‌ورک فرانت‌اند برای توسعه پروژه‌های پاسخ‌گو و اولین تلفن همراه در وب. components/jquery 2.1.3 jQuery JavaScript Library doctrine/annotations v1.2.4 Docblock Annotations Parser Doctrine/cache v1.4.1 کتابخانه ذخیره سازی یک API شی گرا برای بسیاری از پشتیبان های کش ارائه می دهد. 5.0 Common Library for Doctrine projects doctrine/dbal v2.5.1 Database Abstraction Layer Doctrine/doctrine-Bundle v1.4.0 Symfony DoctrineBundle doctrine/doctrine-cache-bundle v1.0.1 Symfony2 Bundle for Doctrine Cache-Bundle. با توجه به حروف و قواعد مفرد/جمع. doctrine/instantiator 1.0.4 یک ابزار کوچک و سبک برای نمونه سازی اشیاء در PHP بدون فراخوانی سازنده آنها doctrine/lexer v1.0.1 Base library برای یک lexer که می تواند در تجزیه کننده های نزولی بازگشتی بالا به پایین استفاده شود. egulias/listeners-debug-command-bundle 1.9.1 فرمان کنسول Symfony 2 برای اشکال زدایی شنوندگان ezsystems/behatbundle dev-master bd95e1b بسته Behat برای کمک به تست بسته‌های eZ و پروژه‌ها ezsystems/comments-bundle dev-master ezsystems/comments-bundle dev-master ezsystems78f /demobundle dev-master c13fb0b بسته آزمایشی برای eZ Publish Platform ezsystems/demobundle-data v0.1.0 Data for ezsystems/demobundle ezsystems/ezpublish-kernel dev-master 3d6e48d eZ Publish API و هسته. این قلب eZ Publish 5 است. ezsystems/platform-ui-assets-bundle v0.5.0 وابستگی دارایی های خارجی برای PlatformUIBundle ezsystems/platform-ui-bundle dev-master 4d0442d eZ Platform UI Bundle ezsystems/-privacy-cookie. 1 بسته ادغام بنر کوکی حریم خصوصی در eZ Publish/eZ Platform fabpot/goutte v1. 0.7 ساده PHP Web Scraper friendsofsymfony/http-cache 1.3.1 ابزارهایی برای مدیریت عدم اعتبار کش friendsofsymfony/http-cache-bundle 1.2.1 تنظیم هدرهای حافظه پنهان HTTP مبتنی بر مسیر و ارسال درخواست های عدم اعتبار به HTTP cache guzzle/9.3 vPHP3. کلاینت HTTP. این کتابخانه به نفع https://packagist.org/packages/guzzlehttp/guzzle hautelook/templated-uri-bundle 2.0.0 Symfony2 Bundle که یک روتر سازگار با RFC-6570 و ایجاد کننده URL را ارائه می دهد، منسوخ شده است. hautelook/templated-uri-router 2.0.1 Symfony2 RFC-6570 سازگار با روتر و URL Generator image/imagine 0.6.2 پردازش تصویر برای PHP 5.3 incenteev/composer-parameter-handler v2.1.0 اسکریپت Composer که فایل را مدیریت می کند. -webdriver 1.0.17 PHP WebDriver for Selenium 2 jdorn/sql-formatter v1.2.17 یک کتابخانه برجسته سازی PHP SQL knplabs/knp-menu v1.1.2 یک کتابخانه منوی شی گرا این کتابخانه منوی شی گرا knplabs/knp-menu-1.2 ارائه می دهد. ادغام کتابخانه KnpMenu kriswallsmith/assetic v1.2.1 Asset Management برای PHP kriswallsmith/buzz v0.13 سبک وزن HTTP League/flysystem 0.5.12 بسیاری از سیستم های فایل، یک API. liip/imagine-bundle 1.2.6 این بسته به دستکاری تصور با استفاده از کتابخانه تصویری monolog/monolog 1.13.1 کمک می کند گزارش های شما را به فایل ها، سوکت ها، صندوق های ورودی، پایگاه های داده و سرویس های وب مختلف nelmio/cors-bundle 1.3.3 اضافه می کند CORS ( پشتیبانی از هدرهای Cross-Origin Resource Sharing در برنامه Symfony2 ocramius/proxy-manager 0.5.2 کتابخانه ای که ابزارهایی برای تولید، نمونه سازی و به طور کلی عملکرد با Object Proxies oneup/flysystem-bundle v0.4.2 یکپارچه سازی کتابخانه انتزاعی سیستم فایل Flysystem2 با Sym شما پروژه pagerfanta/pagerfanta v1.0.3 صفحه بندی برای PHP 5.3 phpdocumentor/reflection-docblock 2.0.4 phpspec/prophecy v1.4.1 چارچوب تمسخرآمیز بسیار برای PHP 5.3+ phpunit/php-code-coverage مجموعه و مجموعه پردازشی 2، php-code-coverage 2، فراهم می کند. ارائه عملکرد برای اطلاعات پوشش کد PHP. phpunit/php-file-iterator 1.4.0 پیاده سازی FilterIterator که فایل ها را بر اساس لیستی از پسوندها فیلتر می کند. phpunit/php-text-template 1.2.0 موتور قالب ساده. phpunit/php-timer 1.0.5 کلاس کاربردی برای زمان بندی phpunit/php-token-stream 1.4.1 Wrapper در اطراف پسوند توکنایزر PHP. phpunit/phpunit 4.6.4 چارچوب تست واحد PHP. phpunit/phpunit-mock-32. .1 کتابخانه Mock Object برای PHPUnit psr/log 1.0.0 رابط مشترک برای ثبت کتابخانه‌ها qafoo/rmf 1.0.0 چارچوب VC بسیار ساده که ساخت برنامه‌های HTTP / خدمات وب REST sebastian/comparator 1 را آسان می‌کند. 1.1 عملکردی را برای مقایسه مقادیر PHP برای برابری ارائه می دهد sebastian/diff 1.3.0 Diff implement sebastian/environment 1.2.2 عملکردی را برای مدیریت محیط های HHVM/PHP ارائه می دهد sebastian/exporter 1.2.0 عملکردی را برای صادرات متغیرهای بصری PHP برای sebastian ارائه می دهد. /global -state 1.0.0 Snapshoting of global state sebastian/recursion-context 1.0.0 عملکردی را برای پردازش بازگشتی متغیرهای PHP فراهم می کند کتابخانه sebastian/version 1.0.5 که به مدیریت تعداد نسخه پروژه های PHP با میزبانی Git کمک می کند sensio/distribution- bundle v3 .0.21 Base bundle for Symfony Distributions sensio/framework-extra-bundle v3.0.7 این بسته راهی برای پیکربندی کنترلرهای شما با حاشیه نویسی sensio/generator-bundle v2.5.3 این بسته کد برای شما sensiolabker/v2security ایجاد می کند. .0.2 یک بررسی کننده امنیتی برای composer.lock swiftmailer/swiftmailer v5.4.0 Swiftmailer، ایمیل PHP غنی از ویژگی های رایگان symfony-cmf/routing 1.3.0 مولفه مسیریابی Symfony2 را برای مسیرهای پویا و زنجیره ای کردن چندین مسیریاب symfony-bundleاس گسترش می دهد. .6.1 Assetic را در Symfony2 symfony/monolog-bundle ادغام می کند v2.7.1 Symfony MonologBundle symfony/swiftmailer-bundle v2.3.8 Symfony SwiftmailerBundle symfony/symfony v2.6.6 فریم ورک Symfony را نگه دارید. tedivm/stash-bundle v0.4.2 کتابخانه ذخیره سازی Stash را در Symfony گنجانده است. twig/extensions v1.2.0 ویژگی‌های اضافی رایج برای Twig که مستقیماً به core twig/twig v1.18.1 تعلق ندارند، زبان قالب انعطاف‌پذیر، سریع و ایمن برای PHP white-october/pagerfanta-bundle v1.0.2 Bundle برای استفاده Pagerfanta با Symfony2 whiteoctober/breadcrumbs-bundle 1.0.2 یک بسته خرده نان کوچک برای Symfony2 zendframework/zend-code 2.2.10 تسهیلاتی را برای تولید کد دلخواه با استفاده از رابط شی گرا zendframework/zend-eventmanager zendframework/zend-eventmanager zendframework 2.2.1.10 فراهم می کند. 0.10 zetacomponents/base 1.9 بسته Base زیرساخت اولیه ای را فراهم می کند که همه بسته ها به آن متکی هستند. بنابراین هر جزء به این بسته متکی است. zetacomponents/feed 1.4 این جزء تجزیه و ایجاد فیدهای RSS1، RSS2 و ATOM را با پشتیبانی از ماژول‌های فید مختلف (dc، محتوا، CreativeCommons، geo، iTunes) انجام می‌دهد. zetacomponents/mail 1.8.1 این مؤلفه به شما امکان می دهد پیام های ایمیل مطابق با استاندارد نامه را بسازید و/یا تجزیه کنید. از پیوست‌ها، پیام‌های چندبخشی و نامه‌های HTML پشتیبانی می‌کند. همچنین با SMTP برای ارسال نامه یا IMAP، P وصل می شود. .. zetacomponents/system-information 1.1 دسترسی به متغیرهای رایج سیستم مانند نوع و سرعت CPU و مقدار حافظه موجود را فراهم می کند.

تمرینات (دوی خشک)

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

به روز رسانی آهنگساز --dry-run --profile --verbose

ایجاد یک پروژه

آخرین چیزی که باید به آن اشاره کنیم، تیم است ایجاد-پروژه.

دستور create project نام بسته را به عنوان آرگومان می گیرد و سپس آن را شبیه سازی و اجرا می کند آهنگساز نصب کنیددرون آن. این برای مقداردهی اولیه پروژه ها عالی است - دیگر نیازی به جستجوی URL بسته مورد نظر در GitHub، شبیه سازی آن، رفتن به پوشه و اجرای دستور نیست. نصب.

پروژه های بزرگی مانند Symfony و Laravel در حال حاضر از این رویکرد برای راه اندازی برنامه های "اسکلت" خود استفاده می کنند و بسیاری دیگر نیز در حال پیوستن به آن هستند.

به عنوان مثال، در لاراول به صورت زیر استفاده می شود:

آهنگساز ایجاد-پروژه laravel/laravel --prefer-dist --profile --verbose
به تیم ایجاد-پروژهمی توانید دو پارامتر دیگر را ارسال کنید: مسیر، که پروژه باید در آن نصب شود (اگر مشخص نشده است از نام بسته استفاده می شود) و نسخه(اگر مشخص نشده باشد مورد دوم استفاده خواهد شد).

نتیجه

امیدوارم این لیست از نکات و ترفندها برای شما مفید بوده باشد. اگر چیزی را از دست دادیم، لطفاً در مورد آن به ما بگویید و ما مقاله را به روز خواهیم کرد. و به یاد داشته باشید، اگر هر دستور یا گزینه ای را فراموش کردید، فقط برگه تقلب را بررسی کنید. آهنگسازی مبارک!

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

برای مثال روبی را در نظر بگیریم. این زبان، لعنت به آن، فقط یک روند ساز در زمینه توسعه وب است. ابزارهای داربست مناسبی وجود دارد (خوب، ZF این را نیز دارد)، و چیزهایی مانند چنگک زدن برای تکمیل کارها. من حتی در مورد مهاجرت ها، تست های واحد با انواع اشیاء ساختگی صحبت نمی کنم. وقتی در Ruby برنامه‌نویسی می‌کردم، این حس شبیه به نشستن در یک صندلی راحت در کلاس تجاری در هواپیما بود و تنها مشکل شما انتخاب نوشیدنی متناسب با روحیه‌تان بود.

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

RubyGems سیستمی برای مدیریت وابستگی ها در پروژه روبی است. به طور خاص، چیزی به نام Bundler وجود دارد که بسته های لازم را نصب می کند یا آنها را با یک کلیک به روز می کند. از او بود که آشکارا کپی شد و به عنوان الهام بخش آهنگساز خدمت کرد.

کاری که Composer می تواند انجام دهد

بنابراین، مروری کوتاه بر ویژگی ها. تنها دو مورد از آنها وجود دارد: مدیریت بسته و بارگیری خودکار کلاس. باید بگویم که بدون آهنگساز، هر دوی این کارها زمان زیادی را می بردند. اینترنت هنوز مملو از مقالاتی به سبک "چگونه ZF 1.x و دکترین 2 را پیوند دهیم" یا "نحوه نصب دکترین 2 ODM و دکترین 1 ORM" است. انحراف، شما می گویید. من عمداً اغراق کردم، اما باید اعتراف کنید، برای ایجاد چند فریمورک یا کتابخانه باید سختی های زیادی را متحمل شوید. با انتشار Composer شرایط تغییر کرده است.

برای بارگذاری خودکار انسانی باید تشکر ویژه کرد. وای، یک بار چقدر برای یکپارچه سازی Zend_Loader_Autoloader و Doctrine/ClassLoader وقت گذاشتم. در حال حاضر این موضوع مربوط به گذشته است. بیا روی یک صندلی بنشینیم

به عنوان مثال composer.json

در اینجا نمونه ای از یک فایل وابستگی از یک پروژه است.

( "نیاز": ( "دکترین/مشترک": "2.3.0"، "دکترین/مهاجرت": "dev-master"، "دکترین/dbal": "2.3.0"، "دکترین/اورم": "2.3" .0، "doctrine/mongodb": "1.0.x-dev"، "doctrine/mongodb-odm": "1.0.x-dev"، "simukti/zf1": "1.12.0"، "zendframework/zendframework" ": "2.0.3" ), "autoload": ( "psr-0": ( "ZendExtra": "vendor/netandreus/zend-extra/lib/"، "DoctrineExtra": "vendor/netandreus/doctrine-extra" /lib/، "MyProject": "vendor/myvendor/myproject/lib/"، "Hydrators": "misc/cache/"، "": "app/default/models/" ) )

پس بیایید خط به خط آن را مرور کنیم. در بلوک الزامی، نام بسته‌ها را به شکل vendorName/packageName و حداقل نسخه‌های مورد نیاز برای پروژه خود را توصیف می‌کنیم. سپس آنها دانلود و در پوشه فروشنده نصب می شوند. همانطور که می بینید، دکترین، برای مثال، به طور همزمان در چندین بسته بسته بندی شده است. به هر حال، اخیراً مهاجرت ها در یک بسته جداگانه منتشر شده است، بنابراین منتظر اخبار پروژه باشید. من تشکر عمیق خود را از رفیق simukti برای انتقال آخرین نسخه های ZF 1.x به آهنگساز ابراز می کنم. زمانی که در یک زمان به آن نیاز داشتم، شروع به انجام آن کردم... اما به دلیل کارهای دیگر هیچ وقت وقت نداشتم. اکنون، در یک پروژه، ما این فرصت را داریم که از مؤلفه‌های Doctrine 2 ODM + ORM + ZF 1.x + ZF 2.x استفاده کنیم. وینگرت دیوانه است، اما ما به آن نیاز داریم. زیرا ما به آرامی از MySQL (ممکن است مایکل ویدنیوس مرا ببخشد) به MongoDB مهاجرت کنیم. ستون فقرات اصلی روی ZF1 است، اما ZF2 نیز از روی کنجکاوی بیکار نیست /* دسیسه */.

اکنون قسمت دوم پیکربندی مورد نیاز است. در اینجا ما کلاس ها (یا بهتر بگوییم فضای نام آنها) و مکان های ذخیره سازی آنها را مشخص می کنیم. ما مسیرهایی را برای فضای نام مربوطه حل می کنیم. لطفا به چند نکته توجه کنید. برای هیدراتورهای دکترین (اگر نمی دانید این چیست، می توانید از آن بگذرید) ما مسیرها را نشان می دهیم، زیرا. با از دست دادن autoloader دکترین، نمی تواند آنها را پیدا کند. آخرین خط، محل سطل زباله است، جایی که کلاس ها با هر فضای نامی را می توان در آن ذخیره کرد. ویژگی اصلی Composer این است که (خوشبختانه) فقط یک چنین دامپ وجود دارد. اما در پروژه ما، کلاس های مورد نیاز از ناکجاآباد آمد، بنابراین مجبور شدیم به اصطلاح جمع آوری زباله انجام دهیم و همه چیز را در یک توده بریزیم. البته، یک روز باید آن را از هم جدا کنیم، اما اکنون حداقل همه زباله ها در یک مکان هستند. خب، ZendExtra و DoctrineExtra افزونه های من هستند که تا حدی در پست هایم توضیح دادم.

اشکالات آهنگساز

خوب، کجا بدون اشکال. شاید قابل توجه ترین اشکال. وقتی با اطمینان از اینکه همه چیز خوب است، php composer.phar را به روز رسانی کنید، ناامید خواهید شد. مشکل اینجاست که کامپوزر منابع را دانلود نمی کند (یا بهتر است بگوییم آنها را به روز نمی کند) اگر شاخه dev مشخص شده باشد و منابع قدیمی تر از 6 ماه باشند. متأسفانه در composer.json من اینها بسته هایی با دکترین بودند. راه حل ساده است، قبل از انجام به روز رسانی، بسته ها را با دکترین حذف می کنیم.

اشکال دوم این بود که مخازن برخی از بسته ها حاوی یک فایل .gitignore است که در حین به روز رسانی/نصب دانلود می شود. و اگر پس از آن کد منبع پروژه را (همراه با این بسته) متعهد کنید، آن را دریافت نمی کنید. به عنوان مثال، در اسمبلی که من با آن کار می کنم، به جای پوشه ای با منبع، یک فایل خالی ظاهر می شود. در همان زمان، commit و push به طور عادی پیش می رود، اما معامله گران شکایت دارند که چیزی به آنها نمی رسد. راه حل ساده است، پس از به روز رسانی، فایل های naifg .gitignore را از فایل های منبع با بسته ها پاک می کنیم.

از Composer استفاده کنم یا نه؟

آره! همانطور که کسی گفت، اگر کتابخانه شما فایل composer.json را در ریشه نداشته باشد، بسیار بد است. بیایید تولید کدهای مزخرف را متوقف کنیم، استانداردها را رعایت کنیم (خب، حداقل psr-0) و به اصطلاح با چهره انسانی کد بنویسیم. من همه طرفدار اتحاد و استانداردسازی هستم! لذت ببرید!

متشکرم!

اگر این مقاله به شما کمک کرد یا می‌خواهید از تحقیقات و وبلاگ من حمایت کنید، بهترین راه برای انجام این کار در اینجا آمده است:

خوب، در درس آخر ما در واقع نوشتن هسته سایت خود را به پایان رساندیم و از این به بعد پیشنهاد می کنم دوچرخه سازی را رها کنیم و به سمت دستاوردهای جامعه جهانی برویم.

یعنی شروع به استفاده کنید مدیر وابستگیبرای PHP - آهنگساز. به ما این امکان را می دهد که به راحتی موارد مفید مختلف را در سایت نصب کنیم، آنها را به روز کنیم و حتی آنها را حذف کنیم. اگر قبلاً با مدیر بسته گنو/لینوکس کار کرده اید، همه اینها برای شما بسیار آشنا خواهد بود.

به عنوان گرم کردن، بیایید حذف کنیم پدیدهاز دایرکتوری اصلی و از طریق Composer نصب کنید. برای این کار باید یک فایل در ریشه سایت ایجاد کنید composer.jsonو بسته های مورد نیاز را در آن ثبت کنید (می توانید در Habré بیشتر بخوانید):
( "require": ( "php":">=5.3.0", "fenom/fenom": "2.*" ) ) اکنون فقط باید composer.phar را دانلود کرده و در روت سایت اجرا کنید:
php composer.phar را در modhost.pro نصب کنید و نیازی به دانلود چیزی ندارید - فقط composer را در دایرکتوری اجرا کنید:
composer install و به طور جادویی ما یک پوشه /vendor/ داریم که Fenom نصب شده است. بعد با آن چه کنیم؟

اصل عملیات

بیایید یک لحظه وقت بگذاریم و من دقیقاً توضیح خواهم داد که Composer چگونه کار می کند اگر قبلاً نمی دانید.

Composer یک مدیر بسته است که طبق قوانین موجود با آنها کار می کند composer.json. آنچه در آنجا می نویسیم نصب خواهد شد.

هنگام نصب پکیج ها، Composer قوانین خود را دنبال می کند و مهمترین فایل - /vendor/ را تولید می کند. autoload.php، که همه کلاس های دانلود شده را بارگیری می کند. معلوم می شود که ما فقط باید این فایل را در پروژه خود قرار دهیم و از این به بعد می توانیم کلاس های خود را اجرا کنیم بدون نیاز:
$Fenom = جدید Fenom::factory($tplDir, $compileDir); یعنی سیستم از قبل می داند که Fenom از نظر فیزیکی در کجا قرار دارد و ما نیازی به انجام reuire_once ("مسیر به fenom") نداریم. همچنین، ما نیازی به نگه داشتن خود Fenom در پروژه خود نداریم، کافی است مال خود را در آنجا ذخیره کنیم composer.json.

یک بار دیگر برای تقویت:

  1. ما composer.json را می نویسیم
  2. بسته ها را از طریق composer.phar نصب کنید
  3. ما به پروژه /vendor/autoload.php متصل می شویم
  4. ما از هر کلاس نصب شده از طریق Class () جدید استفاده می کنیم
هیچ فایل اضافی در پروژه وجود ندارد، نیازی به نیاز اضافی نیست، بسته های نصب شده از طریق همان آهنگساز به روز می شوند:
php composer.phar به روز رسانی همه خیلیساده و راحت هنگامی که از این طرح کار استفاده می کنید، ادامه دوچرخه سواری به سادگی غیرممکن است!

اتصال Fenom

برای کار با بسته های نصب شده، فقط باید autoload.php را به کلاس خود اضافه کنیم هسته:
تابع __construct(array $config = array()) ($this->config = array_merge(array("controllersPath" => dirname(__FILE__). "/Controllers/", "templatesPath" => dirname(__FILE__) . "/ Templates/، "cachePath" => dirname(__FILE__). "/Cache/"، "fenomOptions" => array("auto_reload" => true، "force_verify" => true،)،)، $config)؛ / / برای مثال، در اینجا require_once dirname(dirname(__FILE__)) "/vendor/autoload.php" از روش getFenom() اکنون می توانید بررسی و اتصال فایل ها و همچنین بارگذاری کلاس های آن را حذف کنید. روش نهایی به این صورت است:
تابع عمومی getFenom() ( if (!$this->fenom) ( try ( if (!file_exists($this->config["cachePath"])) ( mkdir($this->config["cachePath"]); ) $this->fenom = Fenom::factory($this->config["templatesPath"], $this->config["cachePath"], $this->config["fenomOptions"] ) catch (Exception) $ e) ($this->log($e->getMessage())؛ return false; ) ) return $this->fenom ) فقط Fenom::factrory را فراخوانی کنید و خودش بارگذاری می شود. در اینجا commit با تغییرات است - ببینید چقدر کد را بلافاصله از پروژه خود حذف کردیم!

چرا باید Fenom را با خود حمل کنیم و آن را به صورت دستی آپدیت کنیم، اگر Composer مدت ها پیش اختراع شده است که خیلی بهتر از این موضوع مراقبت می کند؟ تنها چیزی که نیاز داریم این است که آن را در ریشه پروژه قرار دهیم composer.json.

بیایید اکنون پروژه خودمان را دوباره فاکتور کنیم تا به autoload.php نیز متصل شود.

در عین حال، فایل ها باید به صورت فیزیکی در همان دایرکتوری ها قرار گیرند تا لودر بداند کجا آنها را جستجو کند. نحوه عملکرد دقیقاً در استانداردهای رسمی توضیح داده شده است، اما من به شما توصیه می کنم که آن را بررسی کنید.

این منجر به دو نتیجه می شود: Composer فقط در PHP 5.3+ قابل استفاده است و پروژه ما برای استفاده از فضاهای نام باید بازنویسی شود.

اول از همه باید برای پروژه خود نامی تعریف کنیم. بگذار باشد برویس- از لاتین "کوتاه". فهرست /core/ ما اکنون فضای نام Brevis است. به معنای:

  • کلاس Core به \Brevis\Core تبدیل می شود و در core\Core.php قرار دارد
  • کلاس Controller به \Brevis\Controller تبدیل می شود و در core\Controller.php قرار دارد
  • کلاس Controlles_Home تبدیل به \Brevis\Controllers\Home می شود و در core\Controllers\Home.php قرار دارد.
  • کلاس Controlles_Test به \Brevis\Controllers\Test می شود و در core\Controllers\Test.php قرار دارد.
لطفاً توجه داشته باشید که مکان فیزیکی فایل ها با فضای نام مطابقت دارد. این به این دلیل است که ما در حال حاضر از استاندارد PSR-4 پیروی می کنیم.

حالا در ابتدای هر کلاس فضای نام مورد استفاده را می نویسیم. کلاس های اصلی عبارتند از:
PhpStorm بلافاصله شروع به برجسته کردن تمام موارد استفاده از Exception و Fenom به عنوان نادرست می کند، زیرا آنها در داخل یک فضای نام فراخوانی می شوند، اما بدون تعیین نام کامل. در اینجا 2 اصلاح وجود دارد:

  1. کل کد را مرور کنید و \ را به نام این کلاس ها اضافه کنید تا \Exception و \Fenom وجود داشته باشد.
  2. از مزخرفات رنج نبرید، اما از نام مستعار استفاده کنید - توانایی تعیین یک نام کوتاه برای کلاس
البته گزینه دوم را انتخاب می کنیم:
اکنون نام کنترلرها را تغییر می دهیم و نام مستعار را در آنها مشخص می کنیم:

ما autoload.php را از کلاس \Brevis\Core به index.php منتقل می کنیم، زیرا فضای نام Brevis به زودی از طریق بارگذاری خودکار کار می کند و نیازی به نیاز اضافی ندارد.

Index.php اکنون به شکل زیر است:
require_once dirname(__FILE__). "/vendor/autoload.php"؛ $Core = new \Brevis\Core(); $req = !empty($_REQUEST["q"]) ? trim($_REQUEST["q"]) : ""; $Core->handleRequest($req);
روش \Brevis\Core::handleRequest() را بازنویسی می کنیم و هر گونه بررسی فایل را حذف می کنیم. ما فقط باید وجود کلاسی را با استفاده از آن بررسی کنیم get_class():
تابع عمومی handleRequest($uri) ($request = explode("/", $uri); $className = "\Brevis\Controllers\\" . ucfirst(array_shift($request)); /** @var Controller $controller */ if (!class_exists($className)) ( $controller = new Controllers\Home($this)؛ ) other ($controller = new $className($this); ) $initialize = $controller->initialize($request if ($initialize === true) ($response = $controller->run(); خطا در حین بارگذاری صفحه رخ داده است"؛ ) echo $response؛ ) همانطور که می بینید، نام کامل کنترلر بارگذاری شده را تعیین می کنیم، وجود آن را بررسی می کنیم و اگر چنین کنترلی وجود نداشت، \Brevis\Controllers\ را بارگذاری کنید. صفحه اصلی.

به طور کلی، همه منطق ثابت ماند، اما مقدار کد کاهش یافت. هیچ کار دستی با فایل‌ها وجود ندارد، هیچ الزامی وجود ندارد، تمام کارهای مربوط به اتصال کلاس‌ها با autoload.php انجام می‌شود. بر این اساس، پارامتر controllersPathاز پیکربندی سیستم ناپدید می شود.

تنها چیزی که باقی می ماند این است که پروژه خودمان را به استارت آپ اضافه کنیم. برای انجام این کار، composer.json را به صورت زیر تغییر دهید:
( "name": "Brevis", "autoload": ( "psr-4": ( "Brevis\\": "core/" )), "require": ( "php": ">=5.3.0" , "fenom/fenom": "2.*" ) ) بلوک autoload مشخص می کند که علاوه بر بسته های نصب شده چه مواردی را نیز باید بارگذاری کرد. کلید psr-4دقیقا نحوه بارگذاری پروژه را مشخص می کند و دایرکتوری را مشخص می کند هسته/به عنوان اصلی برای فضای نام برویس.

راه اندازی کنیم
php composer.phar به روز می شود و کلاس های ما به صورت خودکار بارگیری می شوند. همه چیز باید کار کند، به تغییرات GitHub نگاه کنید.

نتیجه

بنابراین ما پروژه خود را مطابق با آخرین استانداردهای دنیای برنامه نویسی PHP بازنویسی کردیم. موافقید، آنقدر ترسناک نبود؟

اما اکنون کد ما تمیز، مرتب، مطابق با استانداردها است و عالی کار می کند!

در درس بعدی، xPDO 3.0 را از طریق Composer نصب می کنیم (بله، قبلا بازنویسی شده است و از namespace ها پشتیبانی می کند، البته در حال حاضر فقط در شاخه dev) و آن را به پایگاه داده خود متصل می کنیم.

بیایید یک نمودار بنویسیم، یک مدل بر اساس آن ایجاد کنیم، و چند جدول ایجاد کنیم.