我的服务器(最大5.3.5)和开发机器(最大5.5.9)上运行着不同的PHP版本。
现在我遇到了一个问题;作曲家更新";以获取某些外部Bundle的最新版本。我的composer.json看起来像
"require": {
"php": ">=5.3.3",
.....
},
我得到了一些需要PHP 5.5的Bundle。我的开发机器上没有问题;问题出现在服务器上。
有没有可能告诉Composer需要5.3.3到5.3.5之间的PHP版本?还是最大可用版本?
我试过
"require": {
"php": ">=5.3.3, <=5.3.5",
.....
},
和
"require": {
"php": "<=5.3.5",
.....
},
但两者都没有成功。我得到了一个"在任何版本中都找不到请求的包php,包名称中可能存在拼写错误";错误
有什么想法吗?
由于composer.json中的config参数可用。你可以这样做:
{
"name": ".../...",
"config": {
"platform": {
"php": "5.3.5"
}
},
"require": {
...
}
}
https://getcomposer.org/doc/06-config.md#platform
至少可以说,您使用最新的PHP进行开发,并且使用非常过时的版本运行生产,这一点值得怀疑。由此可能会出现很多问题,不仅是因为您可能缺少的安全补丁,更重要的是因为主要在5.3.9和5.3.23版本中引入的PHP错误修复,从根本上改变了PHP的一些细节行为。不谈论意外使用5.4或5.5功能的风险。
确实没有办法让Composer处理这种情况。运行composer update
时使用的PHP版本决定依赖项的解析,受PHP版本和安装的PHP扩展的影响。
如果用于更新的PHP与此版本要求不匹配,则不能定义包仅用于5.3.3和5.3.5之间的PHP版本。由于使用的PHP版本超过了版本上限限制,这样的包不符合版本要求,Composer报告没有找到任何包(并没有说明它看到了这些包,但由于版本限制,它们不得不被忽略)。
可能有三种明显的出路:
-
将开发环境降级到实际使用的生产版本。如果使用多个:最古老的一个。这样一来,PHP版本的任何需求都将得到匹配。然后运行
composer update
,就完成了。 -
升级您的生产环境。无需进一步解释,但我必须指出,您不仅错过了许多非常好的PHP功能,还错过了显著的性能提升,因为PHP 5.5确实比5.3快得多。
-
在全局或项目的composer.json中添加一个"platform.php"配置。这将告诉composer覆盖运行composer本身的php版本,而不是计算不同php版本的依赖关系。全局设置为
composer config -g platform.php 5.3.5
(将影响所有进一步的Composer运行),本地设置为不带-g
(如果您在多个项目上使用不同的PHP生产版本进行开发,则只会影响该项目中的Composer操作)。
删除composer.lock和vendor目录。
现在将平台选项放置到composer.json
"config": {
"platform": {
"php": "7.0"
}
},
最后,运行命令composer install
尝试这个(删除逗号):
"require": {
"php": ">=5.3.3 <=5.3.5",
.....
},
试试波浪号操作符怎么样
Tilde运算符~1.2对于遵循语义版本控制的项目非常有用~1.2是相当于>=1.2,<2.0.有关更多详细信息,请阅读下一节在下面
下一个重要发布(Tilde Operator)#
~运算符最好通过示例进行解释:~1.2相当于
=1.2,<2.0,而~ 1.2.3相当至>=1.2.3,<1.3.正如您所看到的,它对涉及语义版本控制的项目非常有用。一种常见的用法是标记您所依赖的最低次要版本,如~1.2(它允许任何高达,但不允许包括2.0)。因为理论上在2.0之前不应该有向后兼容性中断,所以这很好。另一种方法是使用~指定最低版本,但允许指定的最后一位向上。
注:尽管2.0-beta.1是严格以前的版本2.0,版本约束~1.2不会安装上述~1.2仅表示.2可以更改,但1.零件是固定的。
注意:对于主要版本号,~运算符的行为有一个异常。这意味着~1与~1.0,因为它不允许主要数字增加,试图保持向后兼容性。
有没有可能告诉composer需要PHP版本介于5.3.3和5.3.5之间?
是的,有一个:
断字版本范围(-)
包含一组版本。部分的右侧include的版本使用通配符完成。对于示例1.0-2.0相当于>1.0.0<2.12.0.*.另一方面1.0.0-20.1.0相当于>1.0.0<2.1.0.
示例:1.0-2.0
https://getcomposer.org/doc/articles/versions.md#hyphenated-版本范围-
或者你可以像这样使用composer.json
:
{
"require": {
"guzzlehttp/guzzle": ">=5.3.4 <6"
}
}
-我个人更喜欢这种方式,因为它更容易阅读和记住IMHO。