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


Using conditional OR in requirements in a composer.json?

我们的composer有问题。我们的图书馆需要一个either ... or ...图书馆。所以基本上它需要这样:

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

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

这可能和作曲家有关吗?如果是,怎么办?如果不能,我们能用另一种方式解决吗?

我认为您不应该过度使用依赖项定义。

这两种平台情况都需要PHP 5.4或更高版本。我想补充一下,这是唯一的硬依赖。

Composer具有"建议"功能。您的扩展可以用描述性文本来表示只有32位平台需要它

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

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

这样就避免了用户在composer.json中添加一个脚本,该脚本只会帮助他理解第一次尝试安装包时失败的原因。无论如何,他都必须阅读文件。

我认为,您打算通过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 function 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()必须在用户的计算机上可用,并且用户必须在其composer.json中包括您的库和post-install-cmd