【问题标题】:Using conditional OR in requirements in a composer.json?在composer.json的要求中使用条件OR?
【发布时间】:2016-02-15 21:00:36
【问题描述】:

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

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

OR

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

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

这可能与作曲家有关吗?如果有怎么办?如果不能,我们可以用其他方式解决吗?

【问题讨论】:

    标签: php dependencies composer-php


    【解决方案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 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

    【讨论】:

    • 是的,我想在 Packagist 上发布它。关于第二个“警告”:所以这意味着依赖于我的库的库也必须在他们的作曲家中添加脚本?因为显然在生产中不必包含它 - 此检查只能在安装后进行一次。如果用户稍后卸载库,那是他的错。除此之外:这也可以在安装期间/之前执行吗?我的意思是这无关紧要。
    • 如果另一个库要将您的库作为依赖项包含在内,post-install-cmd 仍然必须在应用程序的根目录composer.json 中定义,因为它只能从那里运行。 Composer提供了几个命令和包events,但是你的场景恐怕无法解决。
    【解决方案2】:

    我认为你不应该过度定义依赖项。

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

    Composer 具有“建议”功能。建议您的扩展程序带有描述性文本,以表明只有 32 位平台需要它。

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

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

    这避免了让用户向他的composer.json 添加一个脚本,该脚本无非是帮助他理解为什么在第一次尝试安装你的包时它会失败。无论如何,他必须阅读文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 2012-09-15
      • 2017-06-07
      • 1970-01-01
      • 2023-01-24
      相关资源
      最近更新 更多