为什么使用 PSR4 自动加载不会将任何 类 添加到 classmap/namespaces 文件中?

Why using PSR4 autoload doesn't add any classes into classmap/namespaces file?

我有以下 composer.json 文件:

{
  "require-dev": {
    "queueit/KnownUser.V3.PHP": "dev-master"
  },
  "repositories": [
    {
      "type": "package",
      "package": {
        "name": "queueit/KnownUser.V3.PHP",
        "version": "dev-master",
        "source": {
          "type": "git",
          "url": "https://github.com/kenorb-contrib/KnownUser.V3.PHP.git",
          "reference": "task/composer-autoloader"
        }
      }
    }
  ]
}

但是在 运行 宁 composer install 之后,名称空间或 类 没有添加到 vendor/composer 中的 autoload_classmap.phpautoload_namespaces.php 中。

在此之前,我已将这些行添加到项目的 composer.json 中:

"autoload": {
    "psr-4": {
        "QueueIT\": ""
    }
}

为了在当前文件夹中扫描 class/namespaces,文件如下所示:

$ cat vendor/queueit/KnownUser.V3.PHP/composer.json 
{
    "name": "queueit/knownuserv3",
    "description": "The Queue-it Security Framework is used to ensure that end users cannot bypass the queue by adding a server-side integration to your server.",
    "require": {
        "php": ">=5.3.3"
    },
    "license":"LGPL-3.0",
    "autoload": {
        "psr-4": {
            "QueueIT\": ""
        }
    }
}

手动执行dump-autoload没有任何效果,如下:

$ composer dump-autoload -o
Generating optimized autoload files
$ grep -R QueueIT vendor/composer/
(no results)

为了确认是这种情况,这里是 shell 命令来测试它:

$ php -r 'require __DIR__ . "/vendor/autoload.php"; use QueueIT\KnownUserV3\SDK\KnownUser; new KnownUser;'
Fatal error: Uncaught Error: Class 'QueueIT\KnownUserV3\SDK\KnownUser' not found in Command line code:1

但是,当直接在项目文件夹本身(在 vendor/queueit/KnownUser.V3.PHP/ 文件夹内)执行 composer dump-autoload -o 时会生成类映射。

为什么当从顶级文件夹 运行 时,我在项目 composer.json 中的自动加载定义没有任何效果?

根据 @stof comment at GitHubComposer 不支持从 package 类型的存储库加载 composer.json 文件。 package 类型的目标是下载 支持 Composer 的项目。因此 composer.json 文件 从未 读取。

解决方案是改用 vcs 类型。这是应该工作的composer.json

{
  "require": {
    "queueit/knownuserv3": "dev-master"
  },
  "repositories": [
    {
      "type": "vcs",
      "url": "https://github.com/queueit/KnownUser.V3.PHP"
    }
  ]
}

否则"you would have to copy the project metadata entirely in your package repository, and this is harder to maintain".