【问题标题】:Composer complains about non-compliance to PSR-4, even though everything seems fineComposer 抱怨不遵守 PSR-4,尽管一切看起来都很好
【发布时间】:2021-02-08 17:07:06
【问题描述】:

在我的项目中,我包含了一个我正在开发的包,它有一个 composer.json,其中包含以下自动加载条目:

(当然会被审查以免与我的公司发生麻烦)

{
    "autoload": {
        "psr-4": {
            "Vendor\\Package\\": "src/Package"
        }
    }
}

主项目和包都有一个composer.json,这是来自包的composer.json

我也看到了一些只使用“Vendor\\”的例子,但这导致了完全相同的问题。

我需要版本标签上的包(来自 git 存储库),所以它应该正确获取并安装包。

任何时候 composer 运行自动加载,它都会抱怨命名空间不符合 PSR-4。我已经检查了大写,所有检查。它抱怨我项目中的几乎每个 php 文件。以下是文件结构的示例:

vendor
|- package
 |- src
  |- Package
   |- PackageServiceProvider.php

PackageServiceProvider.php的命名空间是Vendor\Package,类是PackageServiceProvider。 据我所知,这就是它应该的样子。然而作曲家仍然给出弃用通知。

我应该提一下,我还尝试在我尝试过的所有事情(主要是改变大小写)之间运行composer clearcache,但这没有帮助。

我完全不知道如何解决这个问题。

我正在使用 composer 版本 1.10.13 和 Laravel 版本 5.8.38。

我收到的众多弃用通知之一:

Deprecation Notice: Class Vendor\Package\PackageServiceProvider located in D:/wwwroot/project/vendor/{package-vendor}/package/src/Package\PackageServiceProvider.php does not comply with psr-4 autoloading standard. It will not autoload anymore in Composer v2.0. in phar://C:/Users/me/AppData/Local/ComposerSetup/bin/composer.phar/src/Composer/Autoload/ClassMapGenerator.php:201

【问题讨论】:

  • 请分享完整和准确的错误信息。此外,结构看起来不太好:包名称通常由供应商名称和包本身的名称组成。这用于文件结构中,因此保存文件的常用文件夹不像vendor/package,而是vendor/user/package
  • @NicoHaase 我添加了我收到的通知之一。我不确定你所说的供应商/用户/包是什么意思,你能详细说明一下吗?

标签: php composer-php psr-4


【解决方案1】:

事实证明,我们 git 存储库中的包版本在其 composer.json 中有一个错误,我早就在本地修复了该错误。但由于它没有在 repo 中修复,因此 composer 从未完成更新依赖项,也没有更新其与包的链接。

我要做的就是改变

{
    "autoload": {
       "psr-4": {
              "Vendor\\": "src/Package"
          },
    }
}

{
    "autoload": {
       "psr-4": {
              "Vendor\\Package\\": "src/Package"
          },
    }
}

并将其推送到存储库。

【讨论】:

    【解决方案2】:

    这是错误的方法。那个包,显然是你在vendor/ 文件夹中手动植入的(也就是说,可以说,还不错)应该是具有自己的composer.json 文件的有效作曲家包。那么普通的composer dumpautoload 就足以构建用于自动加载的类映射。不需要像你这样的怪事。

    【讨论】:

    • 对不起,我想我有点不清楚。我有一个项目,里面有一个包,我正在开发这两个包。他们都有一个composer.json,我分享的sn-p来自包根目录下的composer.json。我正在从 mian 项目运行 compser dump-autoload。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    相关资源
    最近更新 更多