Composer 2: Что нового?
Composer, менеджер зависимостей для PHP, был выпущен около 8 лет назад, а сегодня опубликовали новую версию, 2.0. За эти годы Composer получил множество новых функций и не отставал от стандартов PHP. Вторая версия совместима со старыми проектами, но привнесет еще несколько замечательных новых функций. В этой статье расскажу о них подробнее.
Ускорение и оптимизация
В этом релизе была улучшена производительность. Теперь он не учитывает уже установленные пакеты, в результате обновление проходит намного быстрее. Также улучшили работу с памятью и процессором.
Команда установки стала умнее. Теперь она не изменяет папку vendor до тех пор, пока не гарантирует, что все пакеты установлены. Это позволяет избежать потери времени на их удаление в случае ошибок во время процесса.
Одной из лучших функций, для меня, стала параллельная загрузка, которая теперь поддерживается из коробки, и нам не нужно устанавливать дополнительные пакеты, как hirak/prestissimo, чтобы это работало.
Поддержка оффлайн
Composer представил возможность использовать его в оффлайн режиме. Это может быть интересно для бенчмарков или при возникновении проблем с подключением к интернету, поэтому вам не нужно удалять Composer install/update из списка команд.
Чтобы это заработало, нужно добавить COMPOSER_DISABLE_NETWORK=1
при выполнении команд:
COMPOSER_DISABLE_NETWORK=1 composer install
или установите его в переменных среды. Он выдаст предупреждение о том, что сеть отключена.:
https://repo.packagist.org could not be fully loaded (Network disabled, request canceled: https://repo.packagist.org/packages.json), package information was loaded from the local cache and may be out of date
кроме того, вы увидите сообщение для пакетов, без кэширования:
The required git reference for gabrielanhaia/laravel-circuit-breaker is not in cache and network is disabled, aborting
Поддержка --dry-run для “require” и “remove”
Эта опция уже была доступна при обновлении пакетов (composer update --dry-run
. Она позволяет нам увидеть, что произойдет при запуске команды, просто отображая данные в терминале, без реальных изменений в вашем проекте или папке vendor.
Composer 2.* дает возможность использовать опцию с composer require
и composer remove
что делает нашу жизнь проще
Предотвращение проблем при работе от root
При выполнении команд от пользователя root теперь требуется подтверждение, чтобы предотвратить наши ошибки.
В предыдущих версиях, когда вы пытались выполнить команду, она вызывала следующее сообщение:
Do not run Composer as root/super user! See https://getcomposer.org/root for details
С Composer 2.* вы должны подтвердить выполнение:
https://getcomposer.org/root for details
Continue as root/super user [yes]?
Если интерактивный режим не поддерживается вашим терминалом, то сообщение не покажется. Вы можете обойти это сообщение, с командой --no-interaction
composer install --no-interaction
Канонические репозитории
Эта функция решает определенную проблему, с которой сталкиваются несколько разработчиков при использовании одного и того же пакета в разных репозиториях. Composer 1.0 следовал определенному порядку при установке/обновлении своих пакетов. Он начал искать пакеты в своем списке репозиториев до тех пор, пока пакет не будет найден (также последняя версия).
Иногда это было не совсем ожидаемое поведение при работе с различными версиями пакетов в других репозиториях (используемых одним и тем же проектом). Представьте себе, что иногда вы хотите загрузить пакет из своего частного репозитория, а не из packagist, в котором есть пакет с тем же именем.
По умолчанию, в composer 2.x, все репозитории являются каноническими. Composer 1.x рассматривал все репозитории как неканонические, и для того, чтобы поменять поведение вручную, вы можете сделать:
{
"repositories": [
{
"type": "composer",
"url": "https://example.org",
"canonical": false
}
]
}
Вы также можете отфильтровать пакеты, которые репозиторий сможет загрузить, либо выбрав те, которые вы хотите, либо исключив те, которые вы не хотите.
Например, здесь мы хотим выбрать только пакет foo/bar
и все пакеты из some-vendor/
из определенного composer репозитория.:
{
"repositories": [
{
"type": "composer",
"url": "https://example.org",
"only": ["foo/bar", "some-vendor/*"]
}
]
}
А в этом примере мы исключаем toy/package
из репозитория, который мы, возможно, не захотим загружать в этот проект.
{
"repositories": [
{
"type": "composer",
"url": "https://example.org",
"exclude": ["toy/package"]
}
]
}
И only
, и exclude
должны быть массивами с именами пакетов, которые также могут содержать знаки (*), которые соответствуют любым символам.\
Игнорировать определенное требование платформы
Если по какой-то причине вы хотите проигнорировать какое-либо определенное требование платформы, вы можете просто запустить команду: composer install --ignore-platform-req php
Она пропустит требование для PHP или конкретной версии. Если вы собираетесь игнорировать все требования, вам следует использовать команду, уже доступную в предыдущих версиях --ignore-platform-reqs
Другие обновления
Есть множество новых мелких возможностей и исправлений ошибок, которые улучшили удобство его использования и качество. Если вам интересно узнать о них больше, ознакомьтесь с описанием к выпуску в гитхаб.