作曲家,自己的包和自动加载的故事

Composer, own packages and the story with autoload

我目前正在开发我自己的 packagist 包,其中包含另一个包。我想我不太明白 autoload.

的用法

我的包是一个 rest-framework 并且依赖于 AltoRouter。我的核心需要加载 AltoRouter 并且由于自动加载器负责我使用以下内容将其包含在我的文件中:

require_once __DIR__.'/../vendor/autoload.php';

我项目中的文件结构如下:

project-root/
├── src/
|   └── core.php
└── vendor/
    ├── autoload.php
    └── altorouter/

现在这可以很好地开发我的包,但是一旦我想通过 packagist(以及 composer)分发它,一切都出错了。 一旦我开始另一个项目,使用 composer 请求我的自定义包并尝试 运行 我的包的代码,require_once(在 core.php 中)将搞砸一切,因为它指向一个(现在)错误的位置。

我做错了什么吗?我是否必须以不同的方式构建我的 "package"-项目?

解决方法: 不要在您的库文件中包含 autoload.php。将其包含在 bootstrap 文件中(例如 index.php

您的库代码通常不需要作曲家自动加载器。每个使用 composer 安装你的包的应用程序都有责任根据自己的需要要求自动加载器。对于 Web 应用程序,这通常发生在入口点脚本中,例如 public 目录根目录中的 index.php

当您单独使用您的库,而不是作为依赖项(例如 运行 测试套件)时,您可以使用需要自动加载器的单独引导脚本。

如果您使用 phpunit,为您的测试设置自动加载很简单。只需将 phpunit.xml.dist 中的 bootstrap 属性指向作曲家自动加载器文件:

<phpunit bootstrap="vendor/autoload.php">
  ...
</phpunit>

这样,作曲家自动加载器将 运行 在你的测试之前,所以你不需要在你的库代码中要求它。