我有一个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)
这是安装使用PHP7.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
,以及如何防止这个错误(和那个包版本(发生?
我的解决方案是删除--ignore-platform-reqs
。对于任何向前倾斜的包(例如,任何Ocramius包(,这要么会像这样失败,要么你会有几个奇怪的错误,你似乎无法找到原因。
--ignore-platform-reqs
所做的是关闭Composer为确保只有与环境兼容的包才能工作而进行的检查。在这种情况下,有问题的包最近更新为使用PHP7.4,并且碰巧在Composer安装程序中使用了新的属性类型声明。
我一直在与其他一些奇怪的事情作斗争(比如Doctrine的实体管理器随机失败,另一个与Ocramius相关的包(,当我运行Composer时,这些事情都通过移除标志而消失了。无论几年前我需要它的原因是什么,我都不再需要了。
如果你觉得自己需要它,请查看config.platform
,它似乎允许你对Composer撒谎,或者努力完全消除对该标志的需要(为什么你认为自己需要它?如果可能的话,请克服它(。
允许伪造平台包(PHP和扩展(,以便模拟生产
env
或在配置中定义目标平台。示例:{"php": "7.0.3", "ext-something": "4.0.3"}
。
https://getcomposer.org/doc/06-config.md#platform