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 использовать этот флаг крайне рекомендуется.