Composer - это де-факто стандартный менеджер зависимостей в PHP, появившийся в 2012 году. Его можно сравнить с npm в JavaScript или pip в Python: он управляет внешними библиотеками (пакетами), которые нужны вашему проекту. Composer представляет собой обычный PHP скрипт, т.е. программу, написанную на языке PHP.
В современном мире почти невозможно писать проекты полностью с нуля. Мы используем библиотеки:
и многие другие.
Composer позволяет:
При установке PHP пакетов Composer не просто устанавливает их, он также устанавливает все зависимости, от которых эти пакеты зависят. Т.е., например, если загружаемая библиотека будет зависеть от 3 других пакетов, а каждая из них, ещё в свою очередь от нескольких и так далее, то Composer всё это установит автоматически.
Загрузку сторонних библиотек Composer выполняет в папку vendor, которую данный PHP скрипт создаёт в корневой директории проекта. Кроме этого, он ещё создаёт специальный файл autoload.php, включив который в проект вы сразу же подключите к нему все ранее загруженные им библиотеки.
require "path/to/vendor/autoload.php";
Дополнительно при загрузке сторонних библиотек Composer генерирует ещё файл composer.lock. Если composer.json - это главный файл Composer, в котором содержится описание основных пакетов, включая требования к их версиям, то composer.lock - это файл, содержащий уже не требования, а реальные версии пакетов, которые им были установлены на компьютер пользователя.
Основное назначение файла composer.lock заключается в полном сохранении среды, в которой осуществлялась разработка и тестирование проекта.
Например, если вы захотите скопировать проект в какое-то другое место без переноса файла composer.lock, то выполнив в нём команду composer install, вы можете получить другие версии пакетов. Это может случиться из-за выхода новых версий как основных пакетов, описанных в файле composer.json, так и их зависимостей, зависимостей их зависимостей и т.д. Например, представим что выход новых версий основных пакетов не произошёл, но обновились версии у пакетов, от которых зависят основные пакеты. В результате установки работающего проекта, можем получить неработоспособный, если в какой-нибудь новой версии одного из этих пакетов была допущена ошибка. Поэтому если вы хотите сохранить полностью среду, то при копировании проекта необходимо дополнительно включать в проект файл composer.lock.
Например, разворачивая проект на production, включающий в себя файл composer.lock, вы получите те же версии зависимостей, которые у вас были при разработке и тестировании.
Как Composer работает "под капотом"?
1. Вы создаете composer.json - файл с описанием зависимостей вашего проекта.
2. Composer читает этот файл и ищет пакеты на Packagist.org.
3. Composer разрешает зависимости: проверяет версии, чтобы библиотеки не конфликтовали друг с другом.
4. Формирует composer.lock - файл с зафиксированными конкретными версиями.
5. Скачивает пакеты в папку vendor/.
6. Создает autoload-файл (vendor/autoload.php), чтобы подключать классы автоматически.
Файл composer.json
Главный конфигурационный файл проекта.
{ "name": "laravel/laravel", "type": "project", "description": "The skeleton application for the Laravel framework.", "keywords": ["laravel", "framework"], "license": "MIT", "require": { "php": "^8.2", }, "require-dev": { "fakerphp/faker": "^1.23", "phpunit/phpunit": "^11.5.3" }, "autoload": { "psr-4": { "App\\": "app/", } }, "autoload-dev": { "psr-4": { "Tests\\": "tests/" } }, "scripts": { "test": "phpunit" }, "extra": { "laravel": { "dont-discover": [] } }, "config": { "optimize-autoloader": true, "sort-packages": true }, "minimum-stability": "stable", "prefer-stable": true }
Объяснение секций:
Файл composer.lock
Этот файл фиксирует точные версии зависимостей.
Зачем нужен:
Автозагрузка (autoload)
Composer автоматически генерирует autoload-файл:
require __DIR__ . '/vendor/autoload.php';
После этого все классы из установленных пакетов доступны в проекте.
Например, мы установили Guzzle:
require __DIR__ . '/vendor/autoload.php'; use GuzzleHttp\Client; $client = new Client(); $response = $client->get('https://alishoff.com'); echo $response->getBody();
Как это работает:
require vs. require-dev
require - зависимости, без которых проект не будет работать.
Пример: guzzlehttp/guzzle.
require-dev - зависимости, которые нужны только при разработке или тестировании.
Пример: phpunit/phpunit.
composer install --no-dev
Эта команда установит только "боевые" зависимости (актуально для продакшена).
Основные команды Composer
- Вывод списка всех доступных команд
composer list
- Получение подробной справки по команде
composer help require
- Создание базового варианта файла composer.json с помощью мастера
composer init
- Создать новый проект
Создание нового проекта из указанного пакета в текущую директорию выполняется так:
composer create-project vendor/package
- Установка пакета
composer require vendor/package composer require "twig/twig:^2.0"
Composer позволяет устанавливать пакеты, которые будут доступны только для разработки. Для этого используйте опцию --dev:
composer require --dev vendor/package composer require --dev phpunit/phpunit
- Установка всех пакетов в проект
composer install
Эта команда работает следующим образом:
- Обновление зависимостей
composer update composer update --dev composer update vendor/package
Эта команда обновит все зависимости, установленные в проекте до последних версий (в соответствии с composer.json) и файл composer.lock. Если необходимо обновить не все пакеты, а один или несколько, то их необходимо перечислить через пробел.
- Удаление пакета
composer remove vendor/package composer remove vendor/package vendor2/package2 composer remove --dev phpunit/phpunit
- Обновление Composer
composer self-update
Команда для обновления Сomposer до последней версии.
- Список пакетов, для которых есть обновления
composer outdated
- Поиск пакетов
Следующей командой можно сделать поиск пакетов в репозиториях:
composer search laravel
- Вывод всех установленных библиотек
Команда для отображения всех установленных PHP пакетов:
composer show
- Команда для диагностики
Если вы считаете, что нашли ошибку, или что-то ведет себя странно, возможно, вы захотите выполнить команду диагностики для выполнения автоматизированной проверки многих общих проблем:
composer diagnose
- Показать информацию о лицензиях зависимостей
composer licenses
- Проверка валидности файла composer.json
composer validate
- Очистка внутреннего кэша пакетов Composer
composer clear-cache
- Вывести зависимости для указанного пакета
composer depends vendor/package
- Пересобрать автозагрузку
composer dump-autoload
Source: Orkhan Alishov's notes