在composer.json中的需求中使用条件OR?

时间:2015-11-14 09:32:00

标签: php dependencies composer-php

我们有作曲家的问题。我们的图书馆需要either ... or ...库。 所以基本上它需要这样:

"php-64bit": ">=5.4.0"

OR

"php": ">=5.4.0" AND "ext-example": "^1.0.2"

所以基本上它需要一个特定的PHP版本。 此外,它需要64位版本的PHP OR才能使用特定的库。

这可能与作曲家有关吗?如果是这样的话?如果没有,我们可以用另一种方式解决它吗?

2 个答案:

答案 0 :(得分:3)

我认为你不应该过度依赖你的依赖关系定义。

两种平台情况都需要PHP 5.4或更高版本。我将其添加为唯一的硬依赖。

Composer具有“建议”功能。您的扩展程序可以使用描述性文本进行建议,以指示只有32位平台才需要它。

您的代码已经必须处理这种情况,因此您可能已经实施了检查,以确定您是否使用64位(并且省略了使用扩展名)。该代码在没有扩展名的情况下在32位上使用时可能会发出错误。

"require": {
    "php": ">=5.4"
},
"suggest": {
    "ext-example":"Required to use this package on 32bit PHP"
}

这可以避免让用户向他的composer.json添加脚本,除了帮助他了解首次尝试安装软件包时失败的原因。无论如何,他必须阅读文档。

答案 1 :(得分:1)

我认为,您打算通过Packagist使您的图书馆可用。

Composer可以运行由事件触发的脚本,但只能运行在根composer.json中定义的脚本。 包含一个脚本,用于检测库中的PHP环境操作系统(64或32位)。由于在这两种情况下都需要">=5.4.0",因此在32位环境中,您的脚本可以有条件地要求您使用其他库"ext-example": "^1.0.2"

库中的示例Cmd.php

namespace Some\Name\Space;
class Cmd
{
    public static funtion check32() {
    // detect environment here... then:
    if ($is32) {
        $cmd = 'php composer.phar require vendor/32bit-library:dev-master';
        exec($cmd, $output, $return_var);
    }
}

这将在应用程序的根目录中运行composer.phar

在根composer.json中引用条目:

"scripts": {
    "post-install-cmd": [
        "Some\\Name\\Space\\Cmd::check32"
    ]
}

这里需要注意的是,exec()必须在用户的计算机上可用,并且用户必须将您的库以及post-install-cmd包含在composer.json中。