Проблема с установкой и обновлением Composer (требуется php ^ 7.0 - ›ваша версия php (8.0.3))

Мы начинаем использовать PHP 8 в новых проектах. Но мы также переносим старые проекты на новый PHP 8. Проблемы возникают при установке зависимостей.

Поскольку PHP 8 относительно новый, все еще существует множество сторонних пакетов, которые зависят от более старых версий PHP (в основном только из-за устаревшей конфигурации).

Моя версия PHP:

martin@empire:~$ php -v
PHP 8.0.3 (cli) (built: Mar  5 2021 07:54:13) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.3, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.3, Copyright (c), by Zend Technologies

Пример composer install в проекте Symfony:

martin@empire:~/projects/twig-example$ composer install
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Your lock file does not contain a compatible set of packages. Please run composer update.

  Problem 1
    - twig/twig is locked to version v2.3.0 and an update of this package was not requested.
    - twig/twig v2.3.0 requires php ^7.0 -> your php version (8.0.3) does not satisfy that requirement.
  Problem 2
    - twig/twig v2.3.0 requires php ^7.0 -> your php version (8.0.3) does not satisfy that requirement.
...

Пример composer update в проекте Laravel 8:

martin@empire:~/projects/collabquest-api$ composer update
Loading composer repositories with package information
Updating dependencies
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - jwilsson/spotify-web-api-php[3.6.0, ..., 3.6.2] require php ^7.0 -> your php version (8.0.3) does not satisfy that requirement.
    - Root composer.json requires jwilsson/spotify-web-api-php ^3.6 -> satisfiable by jwilsson/spotify-web-api-php[3.6.0, 3.6.1, 3.6.2].

Как лучше всего справиться с этой проблемой и решить эту проблему зависимости?


person Martin Osusky    schedule 21.03.2021    source источник
comment
... есть ли что-нибудь неясное в сообщении об ошибке? Почему бы не обновить пакеты до версий, совместимых с PHP 8, если вы хотите использовать PHP 8?   -  person Nico Haase    schedule 22.03.2021
comment
Проблема заключалась в том, что мы также использовали пакеты, для которых еще нет обновлений для PHP 8. И поэтому эта проблема возникла с зависимостями. Также было невозможно ухудшить PHP-версию всего проекта, потому что мы уже использовали возможности PHP 8 в нашем коде. Мы временно решили это с помощью переключателя --ignore-platform-req = php   -  person Martin Osusky    schedule 22.03.2021
comment
Есть ли какая-нибудь причина, например: какая-либо, использовать такую ​​старую версию Twig? Почему бы не обновить его?   -  person Nico Haase    schedule 22.03.2021
comment
@MartinOsusky, пожалуйста, если у вас есть решение, добавьте его в раздел ответов, а не в свой вопрос (особенно, когда решение является абсолютно неправильным советом;)).   -  person gp_sflover    schedule 22.03.2021
comment
@gp_sflover добавил день назад, сейчас просто отвечаю на комментарии :)   -  person Martin Osusky    schedule 22.03.2021
comment
@NicoHaase Нет, нет. Но я просто повторю то, что я упомянул несколько раз, что, к сожалению, я использую пакеты, которые создают зависимости от старых пакетов ... Сама проблема не в пакетах, на которые ссылается сам проект, а в пакетах, на которые ссылаются вложенные зависимости. Окончательное решение - постепенно избавляться от таких токсичных упаковок, но на это уходит много времени.   -  person Martin Osusky    schedule 22.03.2021
comment
Да, на это уходит много времени. Чтобы быть в безопасности в следующий раз, вы всегда должны запускать свои конвейеры CI с той же версией PHP, которую вы используете в производственной среде, чтобы вы сразу получали уведомление при возникновении такой несовместимости.   -  person Nico Haase    schedule 22.03.2021


Ответы (2)


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

person Ibraheem Neotron    schedule 21.03.2021
comment
Я понимаю, что с нами более невозможно перейти на более раннюю версию, потому что у нас уже есть много функций, использующих восьмеричные функции. - person Martin Osusky; 21.03.2021

Обновлять:

Окончательное решение

Используйте более новые пакеты, готовые к PHP 8. Большинство пакетов обновлены.

Если некоторым явно требуются более ранние версии PHP, найдите замену. Или форк их и обнови.

В качестве временного решения можно использовать следующее:

Временное быстрое решение

Композитор имеет следующие возможности:

--ignore-platform-req=IGNORE-PLATFORM-REQ        Ignore a specific platform requirement (php & ext- packages). (multiple values allowed)
--ignore-platform-reqs                           Ignore all platform requirements (php & ext- packages).

Использование:

# for composer install
composer --ignore-platform-req=php install

# for composer update
composer --ignore-platform-req=php update

# also works for require etc.

В большинстве пакетов используется PHP версии 7.x.x или ниже, которая обратно совместима с версией 8. Так что никаких проблем возникнуть не должно.

Обновление: также есть возможность форсировать версию прямо в composer.json. Однако этот вариант нам не пригодился, потому что мы уже использовали в коде особый синтаксис и особенности php версии 8. Несмотря на это, у нас уже были конфликты версий, независимо от того, принудительно ли мы добавили в проект версию PHP 7 или 8.

Пример форсирования версии в composer.json:

{
    "config": {
       "platform": {
           "php": "7.0.0"
       }
    }
}

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

person Martin Osusky    schedule 21.03.2021
comment
В composer.json также есть раздел платформ, который позволяет вам установить версию PHP для использования композитором, тем самым устраняя необходимость в дополнительных аргументах игнорирования. - person Cerad; 21.03.2021
comment
@Cerad Но вы не хотите и, конечно же, вы не можете изменять composer.json во всех пакетах поставщиков. - person Martin Osusky; 21.03.2021
comment
@Cerad вы имеете в виду {config: {platform: {php: 7.0.0}}} Проблема в том, что разработчик забывает, и даже если пакеты обновляются, теоретически может возникнуть проблема с зависимостью версий PHP в будущем . И, что наиболее важно, есть пакеты, которым нужен php8, а также старые, которым нужен php7 ... и это в конечном итоге не решает проблему. - person Martin Osusky; 21.03.2021
comment
Ваш выбор, конечно, хотя я действительно не понимаю, как игнорирование зависимостей на самом деле решает «проблему». В любом случае реальный вопрос заключается в том, почему рассматриваемые пакеты не были настроены для установки под PHP 8. Прошло уже более трех месяцев. Все, что требуется, - это небольшая настройка composer.json, быстрый тест и нажатие кнопки публикации. Лично я бы не стал использовать еще не обновленные пакеты. Или, по крайней мере, я бы их вилкой и поправил сам. - person Cerad; 21.03.2021
comment
Я полностью согласен с вами, и поэтому я бы НЕ рекомендовал постоянное решение, основанное на принудительной версии в composer.json, а просто временно игнорирующее зависимости версии PHP. Чтобы разработчик мог установить проект, а затем выполнить следующие действия. (Замените проблемные пакеты или разветвите их и измените). - person Martin Osusky; 21.03.2021
comment
Я не вижу необходимости в подобных взломах. twig/twig в v2.3.0 (ровно сегодня!) Четыре года, и нет причин использовать его больше, если вы сможете обновить что-нибудь позже. Начиная с версии 2.13.0 (выпущенной в июле 2020 г.), поддерживаются любые более поздние версии PHP. - person Nico Haase; 22.03.2021
comment
@NicoHaase Я согласен, но я просто повторю то, что уже упоминал несколько раз, что, к сожалению, я использую пакеты, которые создают зависимости от старых пакетов ... Сама проблема не в пакетах, на которые ссылается сам проект, а в пакетах на которые ссылаются вложенные зависимости. Окончательное решение - постепенно избавляться от таких токсичных упаковок, но на это уходит много времени. - person Martin Osusky; 22.03.2021