Composer установка несовместимого пакета - PullRequest
0 голосов
/ 05 мая 2020

У меня есть файл composer. json, который включает следующее:

"require": {
    "php": "~7.3.0",
    "ext-imagick": "*",
    "ext-apcu": "*",
    "ext-json": "*",
    "ext-blackfire": "*",
    "doctrine/doctrine-migrations-bundle": "^1.3",

Более позднее использование --ignore-platform-reqs относится к docker изображению, не имеющему этих расширений, но Heroku среда делает.

Для последнего требуется пакет, для которого требуется другой пакет.

$ composer why ocramius/package-versions
doctrine/orm            v2.7.2  requires  ocramius/package-versions (^1.2)
ocramius/proxy-manager  2.8.0   requires  ocramius/package-versions (^1.8.0)

$ composer why ocramius/proxy-manager
doctrine/migrations  v1.8.1  requires  ocramius/proxy-manager (^1.0|^2.0)

Это устанавливает код, который использует объявления типов свойств PHP 7.4. Это вызывает большую уродливую ошибку в PHP 7.3.

$ php -d memory_limit=-1 composer.phar update --ignore-platform-reqs
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 195 installs, 0 updates, 0 removals
  - Installing ocramius/package-versions (1.8.0): Loading from cache

Parse error: syntax error, unexpected 'string' (T_STRING), expecting function (T_FUNCTION) or const (T_CONST) in 
             /var/www/project/vendor/ocramius/package-versions/src/PackageVersions/Installer.php
             on line 33

Почему я всегда получаю эту версию ocramius/package-versions и как предотвратить появление этой ошибки (и этой версии пакета)?

1 Ответ

1 голос
/ 05 мая 2020

Для меня решением было удалить --ignore-platform-reqs. Для любых ориентированных на будущее пакетов (например, любого пакета Ocramius) это либо приведет к серьезному сбою, как это произошло, либо у вас будет несколько странных ошибок, причину которых вы не можете отследить.

Что делает --ignore-platform-reqs, так это отключает проверки, которые делает Composer, чтобы гарантировать, что работают только пакеты, совместимые со средой. В этом случае в пакете-нарушителе было последнее обновление для использования PHP 7.4, и случилось так, что в установщике Composer использовались объявления нового типа свойства.

Я боролся с несколькими другими странностями (например, с ошибкой Entity Manager Doctrine случайным образом, другим пакетом, связанным с Ocramius), и все они исчезли, сняв флаг при запуске Composer. Какой бы ни была причина, по которой мне это было нужно лет go, я больше не нуждаюсь.

Если вы чувствуете, что вам это нужно, посмотрите config.platform, который, кажется, позволяет вам от l ie до Composer, или поработайте, чтобы полностью удалить этот флаг (почему вы думаете, что он вам нужен, избавьтесь от этого, если возможно).

Позволяет вам поддельные пакеты платформы (PHP и расширения), чтобы вы могли эмулировать продакшн env или определить целевую платформу в config. Пример: {"php": "7.0.3", "ext-something": "4.0.3"}.

https://getcomposer.org/doc/06-config.md#platform

...