Composer: всё, что нужно знать о системе управления зависимостями в PHP
Подробный гайд по установке, автозагрузке и основным командам.
Иллюстрация: Катя Павловская для Skillbox Media
В проектах на PHP, будь то простые сайты, блоги или крупные системы с сотнями микросервисов, часто используется сторонний код. Например, библиотеки для формирования HTTP-запросов, работы с видео и изображениями, геолокацией и так далее. Это ускоряет разработку приложения и позволяет разработчикам не тратить время на задачи, которые уже решили другие программисты.
Несмотря на множество очевидных преимуществ, у такого подхода есть свои проблемы: часто сторонний код тоже использует функции других библиотек, и для безопасной разработки нужно быть уверенным в том, что эти библиотеки установлены на вашем компьютере. В мире PHP с этим (и не только) помогает утилита Composer, о которой и поговорим далее.
Содержание
Что такое Composer
Composer — это бесплатная программа, которая позволяет легко устанавливать, удалять и обновлять зависимости в проектах на PHP.
Зависимости — это любые внешние компоненты, которые используются в проекте: библиотеки, фреймворки, базы данных, CMS и так далее. Например, если вам нужно внедрить в проект функцию для хеширования паролей, можно не писать её с нуля, а использовать библиотеку — то есть добавить в проект зависимость.
Проблема в том, что по мере роста числа зависимостей работать с ними становится всё сложнее. Например, чтобы обновить библиотеку, вам придётся идти на сайт разработчика, скачивать архив и подключать его в проект. А если после обновления изменится сигнатура функций библиотеки или структура пространств имён, то проект и вовсе «рассыпется». Придётся исследовать исходный код и переписывать модули, в которых задействованы проблемные функции.
Поэтому разработчики используют менеджеры зависимостей, к коим и относится Composer.
Менеджер зависимостей решает следующие задачи:
- Скачивает зависимости из центрального репозитория и других источников (опционально).
- Формирует список зависимостей, необходимых для работы проекта.
- Обновляет их.
- Фиксирует стабильные версии библиотек и фреймворков, спасая разработчиков от неожиданной поломки проекта после обновления.
- Упрощает автозагрузку классов.
Если вы уже работали с другими языками программирования, такими как JavaScript, Python или Ruby, то наверняка пользовались пакетными менеджерами NPM, PIP или RubyGems. Composer выполняет аналогичные функции в экосистеме PHP.
Теперь коротко по каждому пункту.
Быстрое скачивание пакетов
Конечно, никто не запрещает скачивать пакеты командой git clone <имя_пакета> из GitHub. Однако этот способ влечёт за собой серьёзные проблемы, о которых мы поговорим чуть ниже.
До Composer для этих целей использовали другой репозиторий и одноимённый менеджер — PEAR (PHP Extension and Application Repository). Но у PEAR был ряд недостатков:
- все пакеты устанавливались глобально, то есть нельзя было использовать разные версии для разных проектов;
- каждый класс должен был решать уникальную задачу, из-за чего было практически невозможно добавлять альтернативные решения;
- чтобы пакет попал в PEAR, он должен был набрать достаточное количество голосов в сообществе.
К началу 2010-х PEAR перестал удовлетворять потребности PHP-разработчиков и в сообществе встал вопрос о новом менеджере зависимостей.
Появившийся в 2012 году Composer решал обозначенные проблемы. Он устанавливает пакеты на уровне проекта (в папку vendor) и позволяет поставщикам свободно добавлять библиотеки в репозиторий. По умолчанию Composer получает пакеты из центрального хранилища пакетов Packagist, но вы можете указать и другие источники в файле конфигурации.
Автоматическое разрешение дерева зависимостей
Управление зависимостями не сводится к одному лишь скачиванию необходимого кода. Нельзя просто клонировать репозиторий в папку libs и подключить его. Практически у каждого пакета есть свой ряд зависимостей, у которых, в свою очередь, есть свой и так далее. Распутывать этот клубок довольно утомительно.
Рассмотрим проблему на примере популярной библиотеки Guzzle для отправки HTTP-запросов.
Клонируем репозиторий в папку проекта:
Теперь у нас есть папка guzzle с исходниками и служебными файлами, но пользы от неё пока мало. При попытке инициализировать объект класса Client PHP ругается, что не нашёл некоторые классы:
Вывод:
Можно подключить их напрямую командой require или зарегистрировать автозагрузчик, но это поможет отыскать лишь классы, которые шли в пакете guzzle:
Вывод:
Psr\Http\Client\ClientInterface и прочие классы придётся устанавливать отдельно. Полный их список можно найти в секции require файла guzzle/composer.json.
Без Composer мы бы вручную устанавливали каждый компонент и писали для них автозагрузчики, пока интерпретатор не перестал бы «ругаться». C Composer достаточно такой команды:
Эта команда пройдётся по дереву зависимостей и сама всё установит.
Почти все современные PHP-проекты на GitHub содержат файл composer.json, в котором хранится список зависимостей вместе с информацией об их версиях. Если файл составлен корректно, то вам даже не нужно знать названия компонентов: достаточно ввести команду composer install, и умница-менеджер сделает всё за вас.
Подробнее о composer.json читайте в разделе «Синтаксис composer.json».
Фиксация стабильных версий пакетов
Неизменный спутник composer.json — его тёзка composer.lock. Из-за схожих названий и синтаксиса их часто путают, но на самом деле оба файла незаменимы и выполняют чётко определённые задачи. Если в composer.json перечислены зависимости и их минимальные версии, то composer.lock содержит информацию о точных версиях зависимостей, которые использовались во время разработки и тестирования.
Слово lock в расширении появилось не случайно: файл будет блокировать попытки обновить библиотеки до более свежих версий, чем те, что в нём указаны. Таким образом, например, можно гарантировать одинаковые условия для всех разработчиков в проекте.
Автозагрузка классов
Composer упрощает подключение файлов благодаря собственному универсальному автозагрузчику. С ним можно почти забыть о директивах include и require — достаточно подключить файл vendor/autoload.php, после чего любой класс, именованный в соответствии с PSR-4, будет подключаться только тогда и в том месте, где это потребуется.
Установка Composer
Composer можно установить глобально или локально. В первом случае менеджер будет доступен для работы из любого каталога; при локальной установке — только из папки, которую вы выберете.
Ниже приведены самые доступные и простые способы установки для трёх основных операционных систем: Windows, macOS и Linux.
Важно!
Composer — это набор скриптов на PHP, поэтому перед установкой убедитесь, что на вашем компьютере установлен PHP.
В Windows
Самый простой способ — скачать, запустить исполняемый файл Composer-Setup.exe с официального сайта и следовать указаниям установщика. Экзешник сам добавит путь к Composer в переменную PATH, открыв к нему глобальный доступ.
Порядок установки:
- Перейдите на официальный сайт Composer и скачайте установщик, нажав на кнопку Composer-Setup.exe. Запустите его.
- Следуйте инструкциям установщика. Укажите путь к PHP, если он не обнаруживается автоматически (например, D:\xampp\php\php.exe в XAMPP). Завершите установку, нажав Install.
- Проверьте установку. Откройте командную строку (нажмите Win + R, введите cmd и нажмите Enter). Введите команду composer и убедитесь, что выводится текст, подтверждающий успешную установку:
Второй способ — ручной, через командную строку (cmd.exe) или PowerShell. С его описанием вы можете ознакомиться в официальной документации.
Читайте также:
В Linux (Ubuntu)
1. Откройте терминал и обновите список пакетов:
2. Убедитесь, что на вашей машине установлены расширения, необходимые для корректной работы Composer:
3. Установите программу с помощью утилиты install:
4. Проверьте установку командой composer. В случае успеха терминал вернёт следующий текст:
В macOS
В macOS самый простой и предпочтительный способ установки — с помощью утилиты Homebrew:
- Убедитесь, что Homebrew установлен на вашем компьютере. Для этого откройте терминал и введите команду brew -v. Если Homebrew не установлен, сделайте это по инструкции с официального сайта.
- Установите Composer командой brew install composer.
- Проверьте установку: введите в терминале команду composer и убедитесь, что выводится текст, подтверждающий успешную установку.
Синтаксис composer.json
В composer.json описаны зависимости проекта в формате JSON. Как уже было сказано ранее, он позволяет одной командой установить все необходимые сторонние компоненты.
Файл хранит следующую информацию:
- списки зависимостей для продакшена и разработки;
- директории, в которых автозагрузчик будет искать классы;
- справочная информация (имя и тип проекта, описание, ключевые слова, лицензия);
- конфигурации Composer.
Содержимое файла представляет собой простой JSON-объект с ключами и значениями:
Ключи в JSON всегда берутся в кавычки, а значениями могут быть как числа, булевы значения, сроки и массивы, так и вложенные объекты. За более подробным описанием JSON приглашаем в нашу статью об этом формате.
Как правило, файл не нужно создавать самостоятельно: он сам появится после первого запуска команды require. Но если вы планируете разместить код в публичном репозитории, например Packagist, то придётся вручную добавить справочную информацию и настройки автозагрузчика.
Теперь познакомимся с некоторыми свойствами.
name — имя пакета. Оно состоит из имени вендора и имени пакета, разделёнными прямым слешем /. Именно его пользователи будут вызывать при установке, поэтому для публичных проектов параметр необходим.
type — тип пакета, по умолчанию принято ставить library («библиотека»). Поле используется для определения порядка установки и развёртывания пакета. Например, файлы из library будут скопированы в папку vendor, а пакет metapackage не содержит никаких файлов, зато вызовет установку других пакетов, содержащихся в графе require.
description — короткое описание проекта (обязательно для публичных пакетов).
keywords — массив ключевых слов, по которым можно найти пакет командой composer search.
require — тот самый список зависимостей. В примере выше (это реальный composer.json проекта на Laravel) рядом с каждой версией стоит знак каретки ^, который ограничивает мажорную версию. Это значит, что при работе над проектом лучше ограничиться PHP v8, Laravel v11, PHPUnit v11 и так далее.
Другие символы версионирования в Composer:
- <, >, <=, >= и ! = — диапазон версий, например >=1.1.0<=1.1.8;
- - — диапазон версий через дефис, например 1.1.0-1.18;
- * — подстановка, например 1.1.*;
- ~ — последний разряд должен быть равен или больше указанного. Например, ~1.1.3 эквивалентен >=1.1.3<1.2.
autoload — список директорий, в которых автозагрузчик будет искать классы.
Composer предоставляет четыре метода автозагрузки:
- Файловый — файлы подключаются целиком, по аналогии с require и include. Полезно, когда нужно подключить наборы функций.
- Карты классов — Composer получает список директорий, составляет список классов, которые в них хранятся, и автоматически загружает их при необходимости.
- PSR-0 — каждому пространству имён в соответствие ставится директория (пара «ключ — значение»), при этом структура папок должна воспроизводить структуру пространства имён. Например, если класс LoginController находится в пространстве App\Http\Controllers, то файл LoginController.php должен лежать в папке App\Http\Controllers.
- PSR-4 — то же, что и PSR-0, но структура папок не должна имитировать структуру пространств имён.
Для каждого из методов есть своя секция в разделе autoload: files, classmap, psr-0 и psr-4. Чаще всего вы будете работать с psr-4 — современным стандартом автозагрузки в PHP — и чуть реже с files.
Полный список доступных свойств смотрите в соответствующем разделе документации.
Основные команды Composer
Теперь, когда вы знакомы с устройством Composer, пришло время узнать его основные команды.
Установка пакета
Пожалуй, самая популярная задача, которую разработчики решают с помощью Composer, — установка библиотек и фреймворков. Для этого есть команда require:
Сразу возникает вопрос: а как узнать точное имя искомого пакета? Кратчайший путь лежит через поисковики: гуглим или яндексим библиотеку, копируем название с официального сайта или из README на GitHub и передаём команде require.
Жмём Enter — и вуаля! Composer начинает установку зависимостей, о чём станет понятно по череде сообщений оптимистичного зелёного цвета в терминале. Если установка прошла без проблем, Composer покажет версию установленного пакета.
Установка всех пакетов из composer.json
Обычно в корневой папке PHP-проектов на GitHub лежит файл composer.json со списком необходимых пакетов (о нём мы говорили выше). С помощью этого файла можно установить все зависимости одной командой:
После выполнения команды в корневой директории появится папка vendor с файлами зависимостей и автозагрузчиком autoload.php.
В 99% случаев установка проходит без сучка и задоринки. Проблемы могут доставить пакеты, которые используют функции отсутствующих расширений. Composer сообщит о них в отчёте:
Обычно проблема решается банальным раскомментированием соответствующей строки в php.ini. Но даже если расширения нет в списке — не страшно: его можно скачать в виде файла в формате .dll (в Windows) или .so (в Linux), скопировать в папку с расширениями (точный путь зависит от операционной системы и версии PHP) и прописать название файла в php.ini.
Обновление зависимостей
Обновить все зависимости в проекте можно с помощью команды:
Для обновления конкретной зависимости укажите её имя:
Обновление Composer
У Composer обновления тоже выходят регулярно. Чтобы обновиться до последней версии, используйте следующую команду:
Для установки последней стабильной версии добавьте флаг -- stable.
Удаление пакета
Команда remove удаляет пакет из проекта:
После выполнения пакет исчезнет из папки vendor и разделов require и require-dev файла composer.json.
Проверка валидности файла composer.json
Чтобы composer отработал установку пакетов так, как вы этого ожидаете, файл composer.json должен быть составлен корректно.
Для этого есть команда:
Если файл составлен корректно, вы увидите следующее сообщение:
В противном случае Composer укажет на ошибки:
В этом примере файл вполне пригоден для использования. Но если мы захотим разместить проект в центральном репозитории Packagist, то он не пройдёт проверку, потому что в composer.json нет поля description.
Вывод
Мы познакомились с основами Composer — незаменимого помощника в установке, обновлении и управлении зависимостями в проектах на языке PHP. Мы узнали, как его установить, что такое composer.json и composer.lock, как правильно «готовить» эти файлы и решить некоторые распространённые проблемы, связанные с развёртыванием приложений на их основе.
Сегодня Composer используется практически везде, поэтому бэкенд-разработчику полезно знать не только основные команды, но и принципы, по которым Composer управляет зависимостями в проектах.