Composer - замечательный инструмент, позволяющий PHP разработчикам управлять зависимостями. Раньше разработчики были как правило прикованы к фреймворкам, с которыми работали. Сегодня, отчасти благодаря Composer'у, разработчики больше фокусируются на библиотеках и пакетах, которые уже являются framework-less.

Начать работать с Composer'ом, как и с PHP в целом довольно просто, но не так просто освоить все тонкости инструмента. Composer позволяет быстро начать работу, установив нужные пакеты, но многие его команды сильно упрощены и многие разработчики просто упускают из внимания все возможности менеджера. Мы разберем 5 команд, которые стоит знать досконально.

1. Require

composer require monolog/monolog

Require наверное самая базовая команда, которую разработчики как правило использую при работе с Composer'ом. В дополнение к названию пакета vendor/package можно указать необходимую версию и использовать специальные модификаторы. К примеру если вы хотите заблокировать версию пакета и никогда его не обновлять:

composer require monolog/monolog:1.18.0

Эта команда не будет устанавливать актуальную версию пакета, а установит ту, которую вы указали.

Если вы хотите использовать всегда актуальную версию пакета, которая должна быть больше 1.8.0 можно использовать модификатор >.

composer require monolog/monolog:>1.18.0

Если вы хотите использовать актуальную версию пакета, но не хотите получать минорные обновления, которые могут быть несовместимы, можно использовать модификатор ~.

composer require monolog/monolog:~1.18.0

Если же вы хотите оставаться на текущей мажорной версии пакета и минорные обновления вас не пугают, то можно использовать модификатор ^.

composer require monolog/monolog:^1.18.0

Эта команда будет устанавливать актуальную версию пакета версии 1, но вы никогда не получите обновление до 2-ой версии.

2. Установка пакета глобально

Как правило пакеты устанавливаются и используются локально для какого-нибудь проекта. Но бывают случаи когда пакет или библиотеку лучше установить глобально и использовать в любом из своих проектов.

composer global require "phpunit/phpunit:^5.3.*"

Эта команда установит PHPUnit глобально. Также она позволит получать обновления в рамках версии 5.0.0, так как мы указали ~5.3.* в качестве версии. Но стоит быть осторожным при установке пакетов глобально. Это не создает никаких проблем пока вас устраивает одна версия библиотеки для всех ваших проектов. Но у вас начнутся проблемы если в каком-то проекте вам потребуется PHPUnit версии 6.0.0, который не имеет обратной совместимости с 5-ой версией.

3. Обновление единичного пакета

Одна из самых приятных возможностей Composer'a - поддержание зависимостей в актуальном состоянии. Причем в первом пункте мы разобрали что значит актуально для того или иного разработчика.

composer update

С помощью этой простой команды Composer проверит наличие обновлений для ваших зависимостей. Но что если вам нужно обновить лишь одну библиотеку. Нужно просто указать какую именно.

composer update monolog/monolog

Эта команда проигнурирует все зависимости, кроме указанной.

4. Не используйте dev зависимости

Очень хорошо, когда используемые библиотеки имеют набор тестов и документацию. Однако они редко нужны при работе с ними, документацию удобнее читать в какой-нибудь wiki на github'е, а тесты неплохо собираются в CI. Поэтому многие разработчики библиотек поставляют специальный distribution package, который не включает в себя тесты и документацию. Для установки такого пакета нужно использовать флаг --prefer-dist.

composer require monolog/monolog --prefer-dist

Если же вам важно получить все исходники - используйте флаг --prefer-src.

5. Оптимизируйте ваш автозагрузчик

При добавлении библиотеки в ваш проект с помощью require она просто добавляется в конец вашего автозагрузчика. Это не всегда лучшее решение. Composer позволяет нам оптимизировать автозагрузчик с помощью флага --optimize или коротко -o. Оптимизация автозагрузчика конвертирует его в classmaps. Вместо того чтобы каждый раз проверять наличие файла с помощью file_exists(), Composer создает массив путей для каждого класса. Это может ускорить работу до 30%.

composer dump-autoload --optimize

Или при установке с помощью require.

composer require monolog/monolog:~1.18.0 -o

Если при разработке такие оптимизации не очень важны, то при деплое приложения на production использовать этот флаг крайне рекомендуется.