如果在存储库中设置,则 Composer 自动加载文件不起作用

Composer autoload file not work if set in repositories

我写了以下内容

"repositories": [{
  "type": "package",
  "package": {
    "name": "rysas/ffxiv-lodestone-php-api",
    "version": "dev-master",
    "source": {
      "url": "git://github.com/rysas/Final-Fantasy-XIV-Lodestone-PHP-API.git",
      "type": "git",
      "reference": "origin/master"
    },
    "autoload": {
      "files": [
        "vendor/rysas/ffxiv-lodestone-php-api/ffxiv-lodestone-api.php"
      ]
    }
  }
}]

作曲家更新后,我的库没有加载,如果我执行以下操作,一切正常

"repositories": [{
  "type": "package",
  "package": {
    "name": "rysas/ffxiv-lodestone-php-api",
    "version": "dev-master",
    "source": {
      "url": "git://github.com/rysas/Final-Fantasy-XIV-Lodestone-PHP-API.git",
      "type": "git",
      "reference": "origin/master"
    }
  }
}],
"autoload": {
    "psr-4": {
    "App\": "src"
  },
  "files": [
    "vendor/rysas/ffxiv-lodestone-php-api/ffxiv-lodestone-api.php"
  ]
}

我真的需要在我的包裹声明之外声明自动加载器吗?

当您将包信息添加为 "type=package" 时,您必须从该包的角度进行操作。

并且自动加载规则规定自动加载必须相对于 PACKAGE ROOT 进行定义。包根目录是放置在 "vendor/vendorname/packagename/" 的目录,即您不能将目录 "vendor"、"rysas" 和 "ffxiv-lodestone-php-api" 添加到自动加载定义路径。

此外,如果需要自动加载的代码实际上是 PHP class,则不应使用 "files" 自动加载器。为此使用 classmap 自动加载器(您可以将其指向不同的文件和目录)。区别:只有在需要 class 时才会自动加载类映射。文件自动加载并不是真正自动的 - 文件总是在您需要 "vendor/autoload.php" 时执行。

文件自动加载是为了在 class 之外添加全局函数,因为 PHP 无法自动加载它们。此类代码的更好解决方案是将它们作为静态函数放入 class - 这可以自动加载。它应该被视为旧遗留代码的一种变通方法,使其可以与 Composer 一起使用。