Composer הוא מנהל החבילות של PHP. הריצו composer require vendor/package בתיקיית הפרויקט שלכם: Composer מוריד את הספרייה לתוך vendor/, רושם אותה ב-composer.json, ואתם טוענים אותה, יחד עם כל מה שהתקנתם, בשורה אחת, require __DIR__ . '/vendor/autoload.php';.
composer require monolog/monolog
<?php
require __DIR__ . '/vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Level;
$log = new Logger('app');
$log->pushHandler(new StreamHandler(__DIR__ . '/app.log', Level::Warning));
$log->warning('Disk almost full', ['free' => '2%']);
בלי include לכל קובץ: ה-autoloader טוען את Logger, את StreamHandler ואת כל מה שהן משתמשות בו בפעם הראשונה שכל מחלקה נחוצה. החבילות מגיעות מ-Packagist, המאגר הציבורי ש-Composer מחפש בו כברירת מחדל.
התקנת Composer
Composer צריך קודם PHP על המחשב שלכם (ראו התקנת PHP).
Windows: הורידו והריצו את Composer-Setup.exe מ-getcomposer.org. הוא מוצא את ה-php.exe שלכם ומוסיף את composer ל-PATH. פתחו טרמינל חדש אחר כך.
macOS עם Homebrew:
brew install composer
Linux: החבילה של ההפצה שלכם (sudo apt install composer ב-Debian וב-Ubuntu) עובדת אבל היא לעיתים קרובות גרסה ישנה יותר. המתקין הרשמי נותן את הנוכחית:
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
sudo mv composer.phar /usr/local/bin/composer
דף ההורדה ב-getcomposer.org מציג גם שורה שבודקת את ה-hash של המתקין לפני שמריצים אותו; העתיקו משם את הפקודות כדי לקבל את ה-hash הנוכחי. אחר כך בדקו שזה עובד:
composer --version
composer.json ו-composer.lock
composer init שואלת כמה שאלות וכותבת את composer.json, או ש-composer require יוצרת אותו עם החבילה הראשונה. דוגמה טיפוסית:
{
"name": "acme/shop",
"require": {
"php": ">=8.2",
"monolog/monolog": "^3.0",
"vlucas/phpdotenv": "^5.6"
},
"require-dev": {
"phpunit/phpunit": "^11.0"
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
requireמפרט את מה שהפרויקט צריך כדי לרוץ, כולל גרסת PHP.require-devמפרט כלים לפיתוח בלבד (בדיקות, ניתוח סטטי).composer require --dev phpunit/phpunitמוסיפה אליו, ו-composer install --no-devמדלגת עליו בשרתי פרודקשן.autoloadאומר ל-Composer איפה המחלקות שלכם נמצאות (בהמשך).
לידו, Composer כותב את composer.lock עם הגרסה המדויקת של כל חבילה שהוא התקין, כולל החבילות שהחבילות שלכם תלויות בהן. עשו commit לשני הקבצים. אל תעשו commit ל-vendor/: הוסיפו אותה ל-.gitignore, כי composer install בונה אותה מחדש מקובץ ה-lock.
composer install מול composer update
composer install # install exactly what composer.lock says
composer update # pick the newest allowed versions, rewrite composer.lock
composer update monolog/monolog # update one package only
composer remove monolog/monolog # uninstall and remove from composer.json
composer outdated # list packages with newer versions available
הריצו composer install אחרי clone של פרויקט ובכל פריסה: כולם מקבלים את אותן גרסאות שנבדקו. הריצו composer update רק כשאתם מתכוונים לשדרג, ואז בדקו ועשו commit ל-composer.lock החדש. הרצה של update בשרת פרודקשן מתקינה גרסאות שאף אחד לא בדק.
אילוצי גרסה: ^ ו-~
| אילוץ | מתיר | השתמשו בו ל |
|---|---|---|
^3.2 | 3.2.0 ועד 4.0.0, לא כולל | הבחירה הרגילה: תכונות ותיקונים, בלי גרסה ראשית שוברת |
^0.4 | 0.4.0 ועד 0.5.0, לא כולל | חבילות לפני 1.0, שבהן גרסאות משניות עלולות לשבור |
~3.2 | 3.2.0 ועד 4.0.0, לא כולל | אותו דבר כמו ^3.2 |
~3.2.1 | 3.2.1 ועד 3.3.0, לא כולל | תיקונים בלבד |
3.2.1 | בדיוק 3.2.1 | לעיתים רחוקות; זה חוסם תיקוני אבטחה |
>=3.2 <3.5 | טווח מותאם | עקיפת גרסה שבורה |
composer require vendor/package בלי גרסה בוחרת את הגרסה היציבה החדשה ביותר וכותבת עבורה אילוץ ^, ובדרך כלל זה מה שרוצים.
טעינה אוטומטית של המחלקות שלכם עם PSR-4
PSR-4 היא המוסכמה שממפה namespace לתיקייה: עם "App\\": "src/", המחלקה App\Text\Slug נמצאת ב-src/Text/Slug.php. אחרי הוספת סעיף ה-autoload, הריצו:
composer dump-autoload
ה-autoloader של Composer הוא פונקציה שנרשמת עם spl_autoload_register(), ש-PHP קוראת לה בכל פעם שקוד משתמש במחלקה שעוד לא נטענה. הבלוק הזה כותב שני קובצי מחלקות ורושם autoloader קטן משלו לפי PSR-4, כדי שתוכלו לראות את המיפוי עובד. הוסיפו קובץ מחלקה שלישי והשתמשו בו.
ה-autoloader רץ פעם אחת לכל מחלקה: הקריאה השנייה ל-Slug::from() לא מדפיסה שורת autoload:, כי המחלקה כבר נטענה. בפרויקט אמיתי לא כותבים את הפונקציה הזו בעצמכם; vendor/autoload.php רושם את הגרסה של Composer, שמטפלת גם בחבילות שב-vendor/. namespaces מוסברים בעמוד ה-namespaces.
שגיאות נפוצות
Class "Monolog\Logger" not found. הסקריפט לא עשהrequire 'vendor/autoload.php', או שהנתיב שגוי. השתמשו ב-__DIR__ . '/vendor/autoload.php'כדי שהנתיב לא יהיה תלוי בתיקייה הנוכחית.- המחלקה שלכם לא נמצאת אחרי שהוספתם אותה ל-
autoload. הריצוcomposer dump-autoload, ובדקו שנתיב הקובץ תואם ל-namespace בדיוק, כולל אותיות גדולות וקטנות:App\Text\Slugחייבת להיותsrc/Text/Slug.php, ושרתי Linux מתייחסים ל-src/text/slug.phpכקובץ אחר. Your requirements could not be resolved to an installable set of packages. שתי חבילות צריכות גרסאות לא תואמות של משהו, לעיתים קרובות של PHP עצמה. ההודעה מפרטת את ההתנגשות;composer why-not vendor/package 2.0מסבירה מה חוסם גרסה.composerלא מזוהה. הטרמינל נפתח לפני ההתקנה, או שהתיקייה לא נמצאת ב-PATH שלכם. פתחו טרמינל חדש, או קראו ל-php composer.pharישירות.
שאלות נפוצות
מה ההבדל בין composer install ל-composer update?
composer install מתקינה בדיוק את הגרסאות שרשומות ב-composer.lock, כך שכל מכונה מקבלת את אותו קוד; הריצו אותה אחרי clone ובפריסה. composer update מוצאת את הגרסאות החדשות ביותר שמותרות לפי composer.json, מתקינה אותן וכותבת מחדש את composer.lock; הריצו אותה כשאתם מתכוונים לשדרג.
האם לעשות commit ל-composer.lock ולתיקיית vendor?
עשו commit ל-composer.lock באפליקציות, כדי שכולם יתקינו את אותן גרסאות. אל תעשו commit ל-vendor/: הוסיפו אותה ל-.gitignore ותנו ל-composer install ליצור אותה מחדש.
מה המשמעות של ^ ב-composer.json?
^2.3 מתיר כל גרסה מ-2.3.0 ועד 3.0.0, לא כולל: תכונות חדשות ותיקונים, אבל לא גרסה ראשית חדשה שעלולה לשבור את הקוד שלכם. ~2.3 אומר אותו דבר, ו-~2.3.1 מתיר רק 2.3.x החל מ-2.3.1.
איך טוענים אוטומטית את המחלקות שלי עם Composer?
הוסיפו "autoload": {"psr-4": {"App\\": "src/"}} ל-composer.json, הריצו composer dump-autoload, ועשו require 'vendor/autoload.php'. מחלקה App\Mail\Mailer נטענת אז מ-src/Mail/Mailer.php בפעם הראשונה שמשתמשים בה.
איך בודקים איזו גרסה של Composer מותקנת?
הריצו composer --version. כדי לשדרג את Composer עצמו, הריצו composer self-update, או שדרגו אותו דרך מנהל החבילות שבו התקנתם אותו, כמו brew upgrade composer.