Composer 2: Что нового?

Автор оригинала: Gabriel Anhaia
  • Перевод

Composer, менеджер зависимостей для PHP, был выпущен около 8 лет назад, а сегодня опубликовали новую версию, 2.0. За эти годы Composer получил множество новых функций и не отставал от стандартов PHP. Вторая версия совместима со старыми проектами, но привнесет еще несколько замечательных новых функций. В этой статье расскажу о них подробнее.

Ускорение и оптимизация

В этом релизе была улучшена производительность. Теперь он не учитывает уже установленные пакеты, в результате обновление проходит намного быстрее. Также улучшили работу с памятью и процессором.

Команда установки стала умнее. Теперь она не изменяет папку vendor до тех пор, пока не гарантирует, что все пакеты установлены. Это позволяет избежать потери времени на их удаление в случае ошибок во время процесса.

Одной из лучших функций, для меня, стала параллельная загрузка, которая теперь поддерживается из коробки, и нам не нужно устанавливать дополнительные пакеты, как hirak/prestissimo, чтобы это работало.

Composer v2 почти в 2 раза быстрее, при установке laravel/laravel без кэширования.
Composer v2 почти в 2 раза быстрее, при установке laravel/laravel без кэширования.

Поддержка оффлайн

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

Другие обновления

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

Комментарии 9

    0
    Composer 2 быстрее Composer 1 + prestissimo?
      +1

      Тесты в статье только v1 vs v2. Все же быстрая загрузка из коробки, гораздо удобнее чем использование отдельного пакета.

      0

      Насчёт совместимости есть сомнения. На некоторых проектах composer 1.10 стал выдавать кучу варнингов сообщение, что в 2.0 они будут ошибками, блокирующими установку.

        0
        У меня уже сломался билд докер образа одного проекта, где выкачивалась последняя версия композера и что-то устанавливалось.
        Ворнинги были о том, что PSR-4 autoload стал deprecated и в composer 2 не будет поддерживаться.
          0

          Странно. Такой информации нет в release note + у я проверил на своем проекте — никаких варнингов.

            +1

            Должны появиться, если использовать оптимизацию автолоадера: composer install --no-dev --optimize-autoloader или composer install --no-dev && composer dumpautoload -o


            UPD: Оказывается, я неплохо так ошибся. Он сообщает, что некоторые классы не удовлетворяют PSR-0, а значит не будут загружены автолоадером. про PSR-4 ни слова.

        –1
        обновление — это хорошо, вот только с ним всё посыпалось :(
        и не только из-за престиссимо…
          –1
          Эй народ, а никто не хочет сообщить разрабам Composer, что у них на логотипе нарисован Дирижёр, а не Композитор (Composer)?
            0
            Ну, вообще-то в давние времена композиторы как раз и были дирижерами.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое