作曲家,自己的包和自动加载的故事
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>
这样,作曲家自动加载器将 运行 在你的测试之前,所以你不需要在你的库代码中要求它。
我目前正在开发我自己的 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>
这样,作曲家自动加载器将 运行 在你的测试之前,所以你不需要在你的库代码中要求它。