抑制“模糊 class 分辨率”警告

Suppress “Ambiguous class resolution” warning

有没有办法在 运行 composer install 时禁用“模糊 class 分辨率”警告?

我使用的包在不同的文件夹中有 class 个具有相同名称(和命名空间)的包。

我知道 this bug,但这不是因为 classes 实际上在供应商中有两次。我对此无能为力。

我也知道 --no-autoloader 标志,它当然不会引发警告,只是因为它跳过了自动加载器生成。

找到了解决方案,虽然不是那么明显。写了 about it here.

当使用 paypal/merchant-sdk-php composer 软件包和 运行ning composer install 或 composer update 时,您会收到很多警告消息,如下所示:

...
Writing lock file  
Generating autoload files  
Warning: Ambiguous class resolution, "SetDataRequestType" was found in both "/project/vendor/paypal/merchant-sdk-php/lib/services/PayPalAPIInterfaceService/PayPalAPIInterfaceService.php" and "/project/vendor/paypal/merchant-sdk-php/lib/PayPalAPIInterfaceService/SetDataRequestType.php", the first will be used.  
Warning: Ambiguous class resolution, "MerchantPullPaymentType" was found in both "/project/vendor/paypal/merchant-sdk-php/lib/services/PayPalAPIInterfaceService/PayPalAPIInterfaceService.php" and "/project/vendor/paypal/merchant-sdk-php/lib/PayPalAPIInterfaceService/MerchantPullPaymentType.php", the first will be used.  
Warning: Ambiguous class resolution, "InitiateRecoupReq" was found in both "/project/vendor/paypal/merchant-sdk-php/lib/services/PayPalAPIInterfaceService/PayPalAPIInterfaceService.php" and "/project/vendor/paypal/merchant-sdk-php/lib/PayPalAPIInterfaceService/InitiateRecoupReq.php", the first will be used.  
Warning: Ambiguous class resolution, "CreateBillingAgreementResponseType" was found in both "/project/vendor/paypal/merchant-sdk-php/lib/services/PayPalAPIInterfaceService/PayPalAPIInterfaceService.php" and "/project/vendor/paypal/merchant-sdk-php/lib/PayPalAPIInterfaceService/CreateBillingAgreementResponseType.php", the first will be used.  
Warning: Ambiguous class resolution, "MeasureType" was found in both "/project/vendor/paypal/merchant-sdk-php/lib/services/PayPalAPIInterfaceService/PayPalAPIInterfaceService.php" and "/project/vendor/paypal/merchant-sdk-php/lib/PayPalAPIInterfaceService/MeasureType.php", the first will be used.  
Warning: Ambiguous class resolution, "BusinessInfoType" was found in both "/project/vendor/paypal/merchant-sdk-php/lib/services/PayPalAPIInterfaceService/PayPalAPIInterfaceService.php" and "/project/vendor/paypal/merchant-sdk-php/lib/PayPalAPIInterfaceService/BusinessInfoType.php", the first will be used.  
Warning: Ambiguous class resolution, "ButtonSearchResultType" was found in both "/project/vendor/paypal/merchant-sdk-php/lib/services/PayPalAPIInterfaceService/PayPalAPIInterfaceService.php" and "/project/vendor/paypal/merchant-sdk-php/lib/PayPalAPIInterfaceService/ButtonSearchResultType.php", the first will be used.  
Warning: Ambiguous class resolution, "SetAuthFlowParamReq" was found in both "/project/vendor/paypal/merchant-sdk-php/lib/services/PayPalAPIInterfaceService/PayPalAPIInterfaceService.php" and "/project/vendor/paypal/merchant-sdk-php/lib/PayPalAPIInterfaceService/SetAuthFlowParamReq.php", the first will be used.  
...
# Many more lines

在 Github 上已经有针对此问题的错误票,但似乎没有以高优先级进行处理(因为它于 2014 年 7 月 31 日打开)。

经过一段时间的查找,找到了问题的根源,就是/被调用的PPAutoloader和PayPalAPIInterfaceService。 API 的每个 class 都被复制到 PayPalAPIInterfaceService 中。它用于示例(它们是包的一部分),如果没有 vendor/autoload.php 可用,则使用 PPAutoloader 加载。但是这个内部逻辑(必须调用自动加载器)与 "composer autoloader generation process" 无关,运行 遍历所有文件夹并构建它自己的配置。

那有什么办法呢?

无法从自动加载程序生成过程中排除文件夹(在供应商文件夹中)。当然,您可以使用 --no-autoloader 标志 运行 作曲家。但是你需要自己处理自动加载,这对于 "only" 产生警告的问题来说有点激烈。

在这种情况下,有一个更简单的方法。由于这个 class 只与示例相关(系统中没有使用),我可以简单地删除文件。

为此,我使用了 composer.json 的脚本部分和 pre-autoload-dump 命令事件(在自动加载程序生成过程之前触发)。该命令删除包含 PayPalAPIInterfaceService.

的服务文件夹
"scripts": {
    "pre-autoload-dump": [
        "rm -rf vendor/paypal/merchant-sdk-php/lib/services"
    ]
},

与其从 vendor 目录中删除文件(应该避免),不如将 files/direactories 和不明确的 类 添加到 exclude-from-classmap 部分 composer.json:

"autoload": {
    ...
    "exclude-from-classmap": [
        "vendor/somevendor/somepackage/directory/with/ambiguous/classes/",
        "vendor/somevendor/somepackage/src/AmbiguousClass.php"
    ]
},

然后 Composer 将在类映射生成期间忽略这些文件。

删除 vendor 目录并 运行 composer install 为我消除了错误。