Menu

Composer ב-PHP: התקנת חבילות וטעינה אוטומטית של מחלקות

Composer הוא מנהל החבילות של PHP: composer require vendor/package מוריד ספרייה לתוך vendor/, רושם אותה ב-composer.json, ו-require 'vendor/autoload.php' טוען אותה. למדו להתקין את Composer, את composer.json, אילוצי גרסה, install מול update, וטעינה אוטומטית PSR-4 למחלקות שלכם.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

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.23.2.0 ועד 4.0.0, לא כוללהבחירה הרגילה: תכונות ותיקונים, בלי גרסה ראשית שוברת
^0.40.4.0 ועד 0.5.0, לא כוללחבילות לפני 1.0, שבהן גרסאות משניות עלולות לשבור
~3.23.2.0 ועד 4.0.0, לא כוללאותו דבר כמו ^3.2
~3.2.13.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.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל