PHP Profi

Composer 2.0 уже доступен! Перевод

1/ Что нового?

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

Улучшения производительности

Мы пересмотрели почти все от протокола, используемого между Composer и packagist.org, до разрешения зависимостей, включая параллельную загрузку файлов с использованием curl и оптимизацию оценки ограничений. Это приводит к значительному улучшению как в скорости, так и в использовании памяти. Разница в производительности зависит от вашего варианта использования, поэтому, хоть я и видел отчеты об улучшениях более чем на 50% в некоторых проектах, назвать точную цифру не могу. Однако я уверен, если вы еще не пробовали Composer 2, то будете приятно удивлены.

В качестве дополнительного примечания к этому, require/remove и частичные обновления теперь намного быстрее, потому что Composer будет загружать только метаданные изменяемых пакетов.

Время первоначального обновления + установки (новый проект, пустой кэш) занимает примерно на 60% меньше времени при использовании Composer 2 с включенным ext-curl

Архитектурные изменения и детерминизм

Внутреннее обновление зависимостей было переработано, что приведет к более детерминированным обновлениям. Текущее локальное состояние vendor-директории больше не будет мешать обновлениям.

После завершения обновления процесс установки запускается автоматически, и теперь он в первую очередь будет выполнять все связанные с сетью операции и, при этом, параллельно, если это возможно. Это позволит избежать ситуации, когда ваша vendor-директории окажется наполовину обновленной, если посреди установки возникнет сетевая ошибка.

Фичи рантайма (runtime)

Мы добавили шаг проверки платформы при инициализации vendor/autoload.php, который проверяет, что текущая версия PHP и установленные расширения соответствуют тем, которые требуются вашим зависимостям. В противном случае, операция не будет завершена. Это включено по умолчанию, поэтому почитайте про эту проверку во избежание сюрпризов.

Добавлен новый класс Composer\InstalledVersions, который автоматически загружается в каждом проекте и доступен во время выполнения вашего приложения. Он позволяет проверить какие пакеты и версии используются в рантайме вашего проекта.

Для дополнительных сведений почитайте документацию.

Если ваш код использует одну из этих функций, вам следует подключить "composer-runtime-api": "^2.0" в файле composer.json. Это виртуальный пакет, предоставляемый Composer-ом и гарантирующий, что разработчики должны использовать Composer 2.x для установки вашего пакета.

Улучшения сообщений об ошибках

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

Частичные обновления с временными ограничениями

Иногда бывает полезно обновить или вернуть выбранный пакет до определенной версии. Например, для временного тестирования или чтобы подождать исправления бага. Теперь вы можете запустить, к примеру, composer update vendor/package:1.0.* (или 1.0.12либо другое ограничение версии), чтобы обновить только  vendor/package до версии, которая соответствует этому дополнительному ограничению. Это не обновит вашу require-секцию в composer.json, и не пометит lock-файл как устаревший.

Если вы хотите увеличить/ограничить "потолок" версии, но при этом выполнить полное обновление всех зависимостей, вы можете использовать update --with vendor/package:1.0.* который запустит обновление с этим дополнительным ограничением.

2/ Насколько легко выполнить апгрейд?

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

  • Composer 2.0 по-прежнему поддерживает PHP 5.3 и выше, так же как Composer 1.x
  • файлы composer.lock совместимы между версиями, поэтому вы можете обновиться до версии 2.0 и легко откатиться обратно при необходимости.
  • Большинство команд и аргументов остаются неизменными, и в целом то, что вы знаете о Composer, остаётся таким же в 2.0.

Если вы запустите composer self-update на 1.x, он предупредит вас, что доступна новая стабильная основная версия Composer, и вы можете использовать composer self-update --2 для перехода на неё.

Если у вас возникнут проблемы, вы можете откатиться в любое время с помощью composer self-update --1. Надеюсь, благодаря этому всем будет комфортнее экспериментировать с новым релизом.

Если вы устанавливаете Composer автоматически из скрипта-установщика и хотите остаться на версии 1.x, вы также можете передать аргумент --1, чтобы скрипт не устанавливал Composer 2.0 по умолчанию. В таком случае, пожалуйста, помните и стремитесь своевременно обновляться, так как Composer 1.x не будет поддерживаться долго.

3/ Ломается ли обратная совместимость?

Вот основные причины возникновения проблем с апгрейдом:

  • Плагины: они, вероятно, будут основным источником проблем для большинства пользователей. Плагины должны быть обновлены для поддержки Composer 2, и некоторые из них пока не готовы. Composer 2 будет ругаться и не сможет разрешить зависимости, если плагин его не поддерживает, так что не стоит долго размышлять. Просто попробуйте и посмотрите как пойдет.
  • Новая фича проверки платформы означает, что Composer проверяет версию runtime PHP и доступные расширения чтобы убедиться, что они соответствуют зависимостям проекта. Если обнаруживается несоответствие, автозагрузчик (autoloader) завершает работу с дополнительными сведениями об ошибке, чтобы точно не упустить проблемы. Чтобы избежать проблем в продакшне, рекомендуется запустить composer check-platform-reqs --no-dev при билде/деплое для боевых серверов (для production).
  • Приоритет репозитория: если пакет существует в репозитории с более высоким приоритетом, он теперь будет полностью игнорироваться в репозиториях с более низким приоритетом. Если вам кажется, что при использовании Composer 2 "потерялись" пакеты, посмотрите документацию приоритетов репозиториев.
  • Недопустимые конфигурации PSR-0 / PSR-4 больше не будут автоматически загружаться в режиме оптимизированного автозапуска, согласно предупреждениям, введенным в Composer 1.10. В основном, эти предупреждения были для классов, которые в любом случае не предназначались для автоматической загрузки, поэтому я не ожидаю серьезных проблем, но безопаснее очистить их перед обновлением.

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

4/ Что же дальше?

У нас больше нет очень подробной "дорожной карты" предстоящих фич, поскольку 2.0 содержит тонны новых вкусностей, но одна важная вещь, о которой нужно рассказать - это наша поддержка версий PHP в будущем.

Как я уже упоминал выше, Composer 2.0 поддерживает PHP 5.3+, который на данный момент очень устарел, что местами достаточно сильно усложняет поддержку кода. Мы постарались, чтобы каждый пользователь Composer мог перейти на вторую версию, однако мы планируем отказаться от поддержки EOL-версий PHP в предстоящем minor-релизе.

Composer 2.1 возможно все еще будет поддерживать PHP 5.3 в зависимости от времени релиза и от того, какие фичи в конечном счете будут в нём. Но, самое позднее, в Composer 2.2 мы перестанем поддерживать всё, что меньше PHP 7.1.3. Согласно нашей статистике, это позволяет более чем 90% пользователей Composer использовать последнюю версию, а для тех, кто всё-таки использует устаревшие версии PHP, мы будем продолжать предоставлять критические исправления багов и проблем безопасности в диапазоне 2.0.x или 2.1.x.

Касательно Composer 1.x, то теперь он в той или иной степени является EOL. В эту версию тоже будут вноситься критические фиксы при появлении каких-либо багов, но всем следует как можно скорее перейти на 2.x.

 

 

В заключение я хочу поблагодарить всех, кто внес свой вклад и помог сделать это реальностью. Версия 2.0 представляет собой более 1100 коммитов от 28 человек, более 150 issues и pull-request'ов на GitHub. А также всех, кто тестирует его, просматривает pull-request'ы и т. д. Было вложено много усилий, начиная с первых коммитов, сделанных около двух лет назад.

Я также хочу поблагодарить пользователей Private Packagist, которые помогли финансировать эту работу и позволили нам выделить на нее время. Мы искренне надеемся, что все оценят результат!


2020-10-29 оригинал

Последние посты

Комментарии

авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий