Назад до блогу
phpcomposerdependency-managercli autoloadingpackagist

Що треба знати про Composer: Менеджер залежностей PHP

Детальний розбір Composer – менеджера залежностей PHP. Вивчіть основи, встановлення, використання та найкращі практики для ефективної роботи з проєктами PHP.

Що треба знати про Composer: Менеджер залежностей PHP

Вступ до Composer

У сучасному світі розробки на PHP, ефективне управління залежностями є ключовим для створення масштабованих та підтримуваних проектів. Composer став де-факто стандартом для цієї мети, дозволяючи розробникам легко інтегрувати сторонні бібліотеки та забезпечувати їх правильне функціонування.

Ця стаття покликана надати вам повне розуміння Composer: від його встановлення та базового використання до більш просунутих функцій, таких як автозавантаження та управління скриптами. Ми розглянемо, чому Composer є незамінним інструментом і як його ефективно використовувати у вашій повсякденній розробці.

Що таке Composer?

Composer — це інструмент командного рядка для PHP, який допомагає управляти залежностями вашого проекту. Він дозволяє вам оголосити бібліотеки, від яких залежить ваш проект, і він буде керувати їх (встановлювати/оновлювати) за вас.

Основні функції Composer:

  • Управління залежностями: Дозволяє вказувати пакети, необхідні для вашого проекту, та встановлювати їх автоматично.
  • Автозавантаження: Генерує файл автозавантаження, який дозволяє легко використовувати класи встановлених бібліотек без необхідності вручну включати файли.
  • Стандартизація: Сприяє використанню PSR-стандартів для структури проектів та автозавантаження.
  • Екосистема Packagist: Використовує Packagist — основний репозиторій для PHP-пакетів — як джерело для завантаження бібліотек.

Чому Composer важливий?

До появи Composer розробники PHP часто стикалися з проблемою управління бібліотеками вручну. Це призводило до таких проблем:

  • Ручне завантаження: Необхідність завантажувати кожну бібліотеку окремо та вручну розміщувати її в проекті.
  • Конфлікти версій: Важко було забезпечити сумісність версій різних бібліотек, особливо коли вони мали спільні залежності.
  • Відсутність автозавантаження: Потреба у використанні require або include для кожного файлу, що робило код громіздким та схильним до помилок.
  • Складність оновлення: Оновлення бібліотек було трудомістким процесом, що часто вимагав ручного втручання.

Composer вирішив ці проблеми, надавши централізований та автоматизований підхід до управління залежностями.

Встановлення Composer

Composer — це кросплатформний інструмент, який можна встановити на Windows, macOS та Linux.

Встановлення на Linux / macOS

Відкрийте термінал та виконайте наступні команди:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"

Ці команди завантажують інсталятор Composer, запускають його, а потім видаляють файл інсталятора. Після цього ви отримаєте файл composer.phar у поточній директорії.

Щоб зробити Composer доступним глобально, перемістіть його до директорії, яка є в вашому PATH (наприклад, /usr/local/bin):

sudo mv composer.phar /usr/local/bin/composer

Тепер ви можете викликати Composer з будь-якої директорії, просто набравши composer.

Перевірка встановлення:

composer -V

Ви повинні побачити щось на зразок: Composer version 2.x.x ...

Встановлення на Windows

На Windows найпростіший спосіб встановлення — завантажити та запустити Composer-Setup.exe. Цей інсталятор автоматично налаштує Composer для вас та додасть його до системного PATH.

Після встановлення відкрийте командний рядок і перевірте версію:

composer -V

Основні команди Composer

Composer надає безліч команд для управління проектом. Розглянемо найважливіші:

composer init

Ця команда допомагає ініціалізувати новий файл composer.json у вашому проекті. Вона задає низку питань, щоб зібрати інформацію про ваш проект, такий як ім'я, опис, автор, мінімальна стабільність та тип ліцензії.

composer init

composer require <vendor/package>

Використовується для додавання нової залежності до вашого проекту. Composer завантажить пакет та його власні залежності, оновить composer.json та composer.lock.

Приклад: Додавання пакету monolog/monolog (популярна бібліотека для логування):

composer require monolog/monolog

composer install

Після того, як ви або інші розробники додали залежності до composer.json, команда composer install завантажить та встановить всі ці залежності, використовуючи інформацію з файлу composer.lock. Якщо composer.lock не існує, Composer прочитає composer.json та створить composer.lock.

Важливо: Завжди використовуйте composer install для розгортання проекту, щоб гарантувати встановлення тих самих версій залежностей, що були використані під час розробки.

composer install

composer update

Оновлює всі залежності проекту до найновіших дозволених версій, згідно з обмеженнями у вашому composer.json. Ця команда оновлює файли composer.json та composer.lock.

composer update

composer dump-autoload

Ця команда регенерує файл автозавантаження. Це може бути корисно, якщо ви вручну додали нові класи до свого проекту, які повинні бути автозавантажені, або якщо ви змінили конфігурацію автозавантаження в composer.json.

composer dump-autoload

composer create-project <vendor/package> <directory>

Використовується для створення нового проекту на основі існуючого пакету. Це часто використовується для встановлення фреймворків, таких як Laravel або Symfony.

Приклад: Створення нового проекту Laravel:

composer create-project laravel/laravel my-new-project

Файли composer.json та composer.lock

Розуміння цих двох файлів є критично важливим для ефективної роботи з Composer.

composer.json

composer.json — це серце вашого проекту Composer. Це файл у форматі JSON, який описує ваш проект та його залежності. Ось основні розділи, які ви можете знайти:

  • name: Ім'я вашого пакету (формат vendor/package-name).
  • description: Короткий опис проекту.
  • type: Тип пакету (наприклад, library, project, metapackage).
  • license: Ліцензія проекту.
  • require: Обов'язкові залежності для вашого проекту. Тут ви вказуєте мінімальні версії або діапазони версій пакетів.
    • Приклад: "monolog/monolog": "^3.0" означає, що потрібна версія Monolog 3.0 або вище, але менше 4.0.
  • require-dev: Залежності, необхідні лише для розробки (наприклад, для тестування).
  • autoload: Конфігурація для автозавантаження ваших власних класів.
    • psr-4: Найбільш поширений стандарт автозавантаження.

Приклад composer.json:

{
    "name": "my-vendor/my-project",
    "description": "Мій приклад проекту Composer",
    "type": "project",
    "license": "MIT",
    "authors": [
        {
            "name": "Serhiy Hryn",
            "email": "serhiy.hryn@example.com"
        }
    ],
    "require": {
        "php": ">=8.2",
        "monolog/monolog": "^3.0"
    },
    "require-dev": {
        "phpunit/phpunit": "^10.0"
    },
    "autoload": {
        "psr-4": {
            "MyProject\\": "src/"
        }
    },
    "config": {
        "allow-plugins": {
            "php-http/discovery": true
        }
    },
    "scripts": {
        "test": "phpunit",
        "start": "php -S localhost:8000 -t public/"
    },
    "minimum-stability": "dev"
}

composer.lock

Файл composer.lock генерується після першого запуску composer install або composer update. Цей файл фіксує точні версії всіх залежностей, які були встановлені в проекті.

Ключові моменти про composer.lock:

  • Відтворюваність: Забезпечує, що кожен, хто працює над проектом, буде використовувати абсолютно однакові версії всіх залежностей. Це запобігає проблемі "працює на моїй машині".
  • Необхідність коміту: Файл composer.lock завжди повинен бути закоммічений у вашу систему контролю версій (наприклад, Git). Це критично для забезпечення стабільності та відтворюваності розгортання.
  • Пріоритет: Команда composer install завжди використовує composer.lock, якщо він існує. Якщо composer.lock відсутній, тоді composer install використовує composer.json для визначення версій.

Семантичне версіонування та обмеження версій

Composer використовує семантичне версіонування (Semantic Versioning), яке описується як MAJOR.MINOR.PATCH.

  • MAJOR (Основна): Зміни, що порушують зворотну сумісність.
  • MINOR (Мінорна): Нові функції, але зі збереженням зворотної сумісності.
  • PATCH (Патч): Виправлення помилок, зі збереженням зворотної сумісності.

У composer.json ви використовуєте оператори для визначення дозволених версій:

  • 1.0.0: Точно версія 1.0.0.
  • ^1.2.3 (caret): Сумісно з версією 1.2.3. Дозволяє оновлення до будь-якої версії до 2.0.0 (але не включаючи її), якщо вона сумісна за мажорною версією. Наприклад, ^1.2.3 дозволить 1.x.x до <2.0.0.
  • ~1.2 (tilde): Сумісно з версією 1.2. Дозволяє оновлення до будь-якої версії до 1.3.0 (але не включаючи її), якщо вона сумісна за мінорною версією. Наприклад, ~1.2 дозволить 1.2.x до <1.3.0.
  • >=1.0: Будь-яка версія 1.0 або вище.
  • >1.0 <2.0: Будь-яка версія більша за 1.0, але менша за 2.0.

Автозавантаження (Autoloading)

Однією з найпотужніших функцій Composer є автозавантаження. Composer генерує файл vendor/autoload.php, який ви включаєте у свій проект, і він автоматично завантажує класи, коли вони потрібні.

PSR-4 Автозавантаження

PSR-4 є рекомендованим стандартом для автозавантаження. Він відображає простори імен (namespaces) на файлові шляхи.

Налаштування в composer.json:

{
    "autoload": {
        "psr-4": {
            "MyProject\\": "src/"
        }
    }
}

Це означає, що будь-який клас у просторі імен MyProject\ буде шукатися у директорії src/.

Приклад використання:

// public/index.php
require __DIR__ . '/../vendor/autoload.php';

use MyProject\\Utils\\Helper;
use Monolog\\Logger;
use Monolog\\Handler\\StreamHandler;

$logger = new Logger('my_app');
$logger->pushHandler(new StreamHandler(__DIR__ . '/../app.log', Logger::WARNING));
$logger->warning('Це тестове попередження!');

$helper = new Helper();
echo $helper->greet('Світ'); // Припустимо, що у Helper є метод greet
// src/Utils/Helper.php
<?php

namespace MyProject\\Utils;

class Helper
{
    public function greet(string $name): string
    {
        return "Привіт, " . $name . "!";
    }
}

Після додавання нового класу або зміни конфігурації autoload в composer.json, завжди запускайте:

composer dump-autoload

Це оновить файл vendor/autoload.php.

Автозавантаження файлів (Files Autoloading)

Іноді вам потрібно завантажити певні файли, які не містять класів, або які містять глобальні функції, які ви хочете зробити доступними. Composer дозволяє це зробити через розділ files в autoload.

{
    "autoload": {
        "files": ["src/helpers.php"]
    }
}
// src/helpers.php
<?php

if (!function_exists('sayHello')) {
    function sayHello(string $name): string
    {
        return "Привіт з функції, " . $name . "!";
    }
}

Після запуску composer dump-autoload, функція sayHello буде доступна глобально.

Скрипти Composer

Composer дозволяє визначати власні скрипти, які можуть виконуватися під час певних подій (наприклад, після встановлення або оновлення залежностей) або викликатися вручну.

Приклад у composer.json:

{
    "scripts": {
        "post-install-cmd": [
            "php -r \"copy('.env.example', '.env');\"",
            "php artisan key:generate"
        ],
        "test": "phpunit",
        "lint": "php-cs-fixer fix --diff --verbose"
    }
}
  • post-install-cmd: Виконується після кожної команди composer install.
  • test: Можна викликати за допомогою composer test.
  • lint: Можна викликати за допомогою composer lint.

Ви можете виконати визначені скрипти за допомогою команди composer run-script <script-name>. Наприклад:

composer run-script test
# Або скорочено
composer test

Використання Packagist.org

Packagist.org — це основний репозиторій пакетів для Composer. Коли ви запускаєте composer require, Composer шукає пакети на Packagist.

  • Ви можете знайти тисячі готових бібліотек та фреймворків.
  • Кожен пакет має свою сторінку з інформацією про встановлення, документацію та версії.

Найкращі практики та поради

  1. Завжди комітьте composer.lock: Це забезпечує відтворюваність збірок.
  2. Використовуйте composer install для розгортання: На продакшні завжди використовуйте composer install, а не composer update, щоб уникнути непередбачених оновлень.
  3. Використовуйте require-dev для залежностей розробки: Тримайте залежності для розробки (тести, лінтери) окремо, щоб вони не встановлювалися на продакшн-серверах.
  4. Слідкуйте за версіями PHP: Завжди вказуйте мінімальну версію PHP, яку підтримує ваш проект, у розділі require composer.json.
  5. Розумійте семантичне версіонування: Це допоможе вам краще керувати оновленнями.
  6. Використовуйте плагіни Composer розумно: Деякі бібліотеки пропонують плагіни Composer, які можуть виконувати додаткові дії під час встановлення.
  7. Очищайте кеш Composer: Іноді може знадобитися очистити кеш Composer: composer clear-cache.
  8. Перевіряйте composer validate: Ця команда перевіряє ваш composer.json на наявність синтаксичних помилок та відповідність стандартам.

Приклад робочого проекту з Composer

Давайте створимо мінімальний проект, щоб продемонструвати використання Composer.

  1. Створіть новий проект:
    mkdir my-composer-app
    cd my-composer-app
    
  2. Ініціалізуйте Composer:
    composer init
    

    Відповідайте на питання. Коли запитає про залежності, додайте monolog/monolog.
    Would you like to define your dependencies (require) interactively? (yes/no) [yes]? yes
    Search for a package: monolog/monolog
    Versions: * 3.7.0, * 3.6.0, * 3.5.0, * 3.4.0, * 3.3.0, * 3.2.0, * 3.1.0, * 3.0.0, * 2.9.1, * 2.9.0, * 2.8.0, * 2.7.0, * 2.6.0, * 2.5.0, * 2.4.0, * 2.3.0, * 2.2.0, * 2.1.0, * 2.0.0, * 1.27.1, * 1.27.0, * 1.26.1, * 1.26.0
    Enter the version constraint to require (e.g. ^2.0 || ^3.0): ^3.0
    
  3. Створіть файл src/App.php:
    <?php
    
    namespace MyComposerApp;
    
    use Monolog\\Logger;
    use Monolog\\Handler\\StreamHandler;
    
    class App
    {
        private Logger $logger;
    
        public function __construct()
        {
            $this->logger = new Logger('my_app');
            $this->logger->pushHandler(new StreamHandler(__DIR__ . '/../app.log', Logger::WARNING));
        }
    
        public function run(): void
        {
            $this->logger->warning('Додаток завантажено!');
            echo "Привіт, світ від Composer-додатку!" . PHP_EOL;
        }
    }
    
  4. Створіть файл public/index.php:
    <?php
    
    require __DIR__ . '/../vendor/autoload.php';
    
    use MyComposerApp\\App;
    
    $app = new App();
    $app->run();
    
  5. Запустіть додаток:
    php public/index.php
    

    Ви повинні побачити Привіт, світ від Composer-додатку! у консолі, а у файлі app.log буде запис Додаток завантажено!.

Висновок

Composer є наріжним каменем сучасної PHP-розробки. Він не тільки спрощує управління залежностями, але й інтегрує важливі практики, такі як автозавантаження, що робить розробку на PHP більш структурованою, передбачуваною та ефективною.

Вивчивши Composer, ви отримуєте потужний інструмент, який значно прискорить ваш робочий процес, дозволить легко інтегрувати тисячі високоякісних бібліотек та допоможе створювати більш надійні та підтримувані PHP-проекти. Не ігноруйте Composer – це ваш найкращий друг у світі PHP!