Composer安装不兼容的软件包

时间:2020-05-05 19:41:38

标签: php package composer-php php-7.3

我有一个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 个答案:

答案 0 :(得分:1)

对我来说,解决方案是删除--ignore-platform-reqs。对于任何前向软件包(例如,任何Ocramius软件包),这都将像这样严重失败,或者您将遇到一些奇怪的错误,似乎无法找出原因。

--ignore-platform-reqs的作用是关闭Composer进行的检查,以确保仅与环境兼容的程序包有效。在这种情况下,有问题的软件包最近进行了更新以使用PHP 7.4,并且碰巧在Composer安装程序中使用了新的属性类型声明。

我一直在与其他一些怪异作斗争(例如,Doctrine的Entity Manager随机失败,另一个与Ocramius有关的软件包),当我运行Composer时,都通过删除标志来消除了这些怪异。不管几年前我需要它的原因是什么,我都不再这样做。

如果您认为自己需要它,请查看config.platform,它似乎可以让您撒谎给Composer,或者完全删除需要该标志的东西(无论您认为有何必要,请尽可能克服它。 )。

允许您伪造平台软件包(PHP和扩展),以便您可以模拟生产env或在配置中定义目标平台。例如:{"php": "7.0.3", "ext-something": "4.0.3"}

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