ChatGPT解决这个技术问题 Extra ChatGPT

强制作曲家要求版本 X 和版本 Y 之间的 PHP 版本

我们在您的服务器(最高 5.3.5)和开发机器(最高 5.5.9)上运行不同的 PHP 版本。

现在我们遇到了一个问题,我们做了一个“composer update”来获取一些外部Bundles的最新版本。因为你的 composer.json 看起来像

"require": {
        "php": ">=5.3.3",
        .....
    },

我们得到了一些需要 PHP 5.5 的 Bundle。在我们的开发机器上没问题,但在服务器上:(

是否有可能告诉作曲家需要 5.3.3 和 5.3.5 之间的 PHP 版本?还是最大可用版本?

我试过了

"require": {
        "php": ">=5.3.3, <=5.3.5",
            .....
        },

"require": {
            "php": "<=5.3.5",
                .....
            },

但两者都没有成功。我收到“在任何版本中都找不到请求的包 php,包名称可能有错别字。”错误。

有任何想法吗?提前致谢


N
NuSphere

由于 composer.json 中的 config 参数可用。你可以这样:

{
    "name": ".../...",
    "config": {
        "platform": {
            "php": "5.3.5"
        }
    },
    "require": {
        ...
    }
} 

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


尽管指定了此参数,但库仍会安装高于指定 PHP 版本的版本。例如,我指定了 PHP 版本 5.4.36,但 Composer 仍然安装 Symfony 版本 3.1.3,它需要 5.5+。结论:不起作用。
platform 主要是让你伪造平台包(PHP 和扩展),以便你可以模拟生产环境。 require 是版本 X 和版本 Y 之间的更好选择
这对我来说效果很好!我需要安装与 PHP <=7.0.16 兼容的软件包
可能在 Raptor 的链中某处存在错误,但 config.platform.php 旨在准确解决此问题中的问题,并且它有效。也许使用的作曲家版本还不支持它。
正是我要找的,谢谢!需要注意的是,您需要在设置后运行 composer update,就像对 composer.json 的任何其他与依赖相关的更改一样。
S
Sven

我发现至少可以说您正在使用可用的最新 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 快得多。将“platform.php”配置添加到全局或项目的 composer.json。这将告诉 Composer 覆盖运行 Composer 本身的 PHP 版本,而是计算与该不同 PHP 版本的依赖关系。 composer config -g platform.php 5.3.5 用于全局设置(将影响所有进一步的 Composer 运行),没有 -g 用于本地设置(只会影响该项目中的 Composer 操作,以防您在多个具有不同生产的项目上开发PHP 版本)。


我添加了一个新的第三个选项,它应该对 Composer 的更新版本有效,可能从 1.0.0-beta1 及更高版本开始(我现在不会深入研究 alpha 发行说明来准确告诉你)。只需使用稳定的 1.0.0 版本即可。
@Arcesilas 你是什么意思?问题基本上是关于如何限制 Composer 在更新期间为太高级的 PHP 版本选择包 - 所以锁定文件虽然会影响更新的结果,但在这种情况下是没有意义的。
人们有限制......不是那么可疑,对吧?
在开发和生产中不使用相同的版本是有问题的。错误很容易出现,例如使用生产中没有的 PHP 功能,或者在 DEV 中修复了错误,但在生产中仍未修复。不使用相同的版本意味着您不会遇到相同的行为。尤其是在 prod 中的 PHP 5.3 与 dev 中的 PHP 5.5 混合时(如果将 5.5.x 与 5.5.y 混合,问题不太可能或令人惊讶)。
嗨,斯文,我们也这样做。在更高版本中开发,然后我们在生产中。原因是:我们的代码已经为未来做好了准备。因此,当我们需要升级时,我们不必太担心,因为它已经过测试。我们是没有 php-unit 等的普通开发人员,因为当我们的框架出现时,它并不存在。所以我们有其他方法来监控和测试我们的代码。
M
Mike Milkman

试试这个(删除逗号):

"require": {
    "php": ">=5.3.3 <=5.3.5",
        .....
    },

J
Jeff Puckett

删除您的 composer.lock 和 vendor 目录。

现在将平台选项放置到 composer.json

"config": {

    "platform": {
        "php": "7.0"
    }

},

最后,运行命令 composer install


B
Billy

试试波浪号运算符怎么样

波浪号运算符 ~1.2 对于遵循语义版本控制的项目非常有用。 ~1.2 等价于 >=1.2,<2.0。有关更多详细信息,请阅读下面的下一部分。

下一个重要版本(波浪号运算符)#

~ 运算符最好通过示例来解释:~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 相同,因为它不允许主要数字增加以保持向后兼容性。


w
whyer

是否有可能告诉作曲家需要 5.3.3 和 5.3.5 之间的 PHP 版本?

是的,有一个:

连字符版本范围 ( - ) 包含的版本集。右侧包含的部分版本使用通配符完成。例如 1.0 - 2.0 等价于 >=1.0.0 <2.1,因为 2.0 变为 2.0.*。另一方面,1.0.0 - 2.1.0 等价于 >=1.0.0 <=2.1.0。示例:1.0 - 2.0 https://getcomposer.org/doc/articles/versions.md#hyphenated-version-range-

或者您可以像这样使用 composer.json

{
  "require": {
    "guzzlehttp/guzzle": ">=5.3.4 <6"
  }
}

- 我个人更喜欢这种方式,因为它更容易阅读和记住恕我直言。


PS 我是从搜索引擎到这里的,但在这里没有找到答案,所以当我在 Composer 的网站上找到它时,我决定在这里发布它。希望这可以帮助像我一样来到这里的人。
有一个 community guideline 可以删除与问题或答案不直接相关的内容,而是 no "official" rule。如果您觉得它是答案不可或缺的一部分,或者只是想保留您的声音,请务必回滚我的编辑 - 尽管我认为将其作为评论留下是添加该添加的 的地方。也就是说,感谢您的回答和+1。
@bishop thx,这很有趣。
你到底在哪里输入这个?我整天都在为此苦苦挣扎。
@Eduardo 我已经为你编辑了我的答案 - 我添加了一个示例 composer.json。嗯!