为指定的 PHP 版本安装 Composer 依赖

6

是否可以告诉Composer,只有在使用特定版本的PHP时才安装依赖项?

原因:我的库使用password_hash函数,在5.5+中可用,并且有一个兼容库ircmaxell/password-compat可用于PHP 5.4。然而,在5.5+上安装此库是完全没有意义的。那么,是否可以告诉Composer仅在运行版本<5.5时安装ircmaxell/password-compat?

简短的故事,以使问题更清晰 - 我想告诉Composer:

IF php version < 5.5:
    install ircmaxell/password-compat
ELSE:
    skip ircmaxell/password-compat

提前致谢。

附言:请仅发布如何执行此操作的直接答案,而不是任何解决方法或建议放弃5.4支持。我也可以想到它们,我在这里寻找聪明的解决方案 :)


是的,请看这个:http://odino.org/managing-php-dependencies-with-composer/ - RiggsFolly
我认为你最好看一下scripts属性,并与之合作解决问题。 - vascowhite
@RiggsFolly 也许我漏看了什么,但我在那篇文章中找不到任何回答OP问题的内容? - vascowhite
是的,我也没有看到答案 :) 我希望我的问题表述清楚了,我会尽力澄清更多。 - amik
composer.json中有3个主要部分,看看第3部分"require": { "php": ">=5.3.2", "kriswallsmith/Buzz": ">=0.5" }但是我可能错了 - RiggsFolly
@RiggsFolly 这意味着该项目需要的是 PHP 版本 >= 5.3.2,而不是在 PHP 运行时版本 >= 5.3.2 的情况下安装某些东西。但还是谢谢你的尝试。 - amik
2个回答

3

简短的答案是“不可能”。

这个依赖关系并不是很重要。为什么不让它安装呢?如果你使用的是 PHP 5.5,内置的密码函数仍然会被使用。

你也可以将 password-compat 设置为可选依赖项 (suggests)。这种情况下,需要维护者在应用程序旁边安装它。

最后,你可以创建一个次要的虚拟包。比如你的包名叫做“Acme”,那么可以创建一个名为“Acme-php54”的次要包,它依赖于 both password_compat 和你的主项目。这样就将依赖关系从你的项目中分离出来了。但我认为最简单的方法是只要你打算支持 PHP 5.4,就始终安装它,并在不久的将来放弃 PHP 5.4。


是的,我知道这不是什么大问题,如果在这里找不到合适的解决方案,我会这样做。我想保持我的项目干净,这就是为什么我在问这个问题。 - amik
谢谢您的更多想法 :) 但是1)将其作为可选依赖项并不好,需要最终用户思考,使travis构建复杂化。2)制作一个次要包并不能解决问题,缺少安装它的决策逻辑。3)我很好奇这是否总体上是可能的,是的,我也可以想出许多类似的解决方法 :) - amik
看看“简短回答”部分就好了;) 对此非常有信心。 - Evert

2

是的,这是可能的。

考虑拥有一个分支,比如 1.x 用于遗留的 PHP 版本,例如

{
    "name": "some/library",
    "version": "1.0.0",
    "require": {
        "ircmaxell/password-compat": "*"
    }
}

并且2.x分支适用于5.5以上版本

{
    "name": "some/library",
    "version": "2.0.0",
    "require": {
        "php": ">=5.5"
    }
}

这样可以放宽版本要求,例如some/library:*会自动解析到相应的版本。
另一种方法是指导用户添加。
"replace": {
    "ircmaxell/password-compat": "*"
}

如果需要,用户可以自行更改PHP解释器。请注意,一些用户(包括我自己)可以随时更改他们的php解释器,并且不会太高兴地调试这种自动问题。


好的,谢谢,这看起来是最接近的方法了,但我也不喜欢这种自动化,所以如果没有更清晰的方式,我就不会这样做。 - amik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接