强制composer要求PHP版本介于X版和Y版之间


Force composer to require PHP Version between Version X and Version Y

我的服务器(最大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报告没有找到任何包(并没有说明它看到了这些包,但由于版本限制,它们不得不被忽略)。

可能有三种明显的出路:

  1. 将开发环境降级到实际使用的生产版本。如果使用多个:最古老的一个。这样一来,PHP版本的任何需求都将得到匹配。然后运行composer update,就完成了。

  2. 升级您的生产环境。无需进一步解释,但我必须指出,您不仅错过了许多非常好的PHP功能,还错过了显著的性能提升,因为PHP 5.5确实比5.3快得多。

  3. 在全局或项目的composer.json中添加一个"platform.php"配置。这将告诉composer覆盖运行composer本身的php版本,而不是计算不同php版本的依赖关系。全局设置为composer config -g platform.php 5.3.5(将影响所有进一步的Composer运行),本地设置为不带-g(如果您在多个项目上使用不同的PHP生产版本进行开发,则只会影响该项目中的Composer操作)。

删除composer.lockvendor目录。

现在将平台选项放置到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。

相关文章: