我有一个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
,以及如何防止发生此错误(以及该软件包的版本)?
答案 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"}
。