我正在尝试制作一个作曲家包,但我正在努力设置自动加载以在我正在开发它的项目中工作。
我有两个项目:
Project Foo(我正在其中开发包)。
项目栏(我在其中安装了包:)composer require myhandle/mypackage
。
在 Project Foo 中,我(显然)也必须能够使用该包。但是在我自己的包中设置自动加载不起作用。
然而...当我将更改提交到 Github、在 Packagist 更新包并composer update
在 Project Bar 中运行时,它就可以工作了(?!)。
奇怪的是......如果我composer update
从 Project Foo (该项目不起作用)中进行操作。因此,将软件包更新到当前版本(?),使其开始工作。
所以它一定与我如何设置自动加载有关。
一张纸条:
我通过在供应商目录中创建一个新的(空)文件夹来启动该包,然后在那里构建该包。我认为这很聪明,因为它会反映出如果我有composer required
包裹的话它会是什么样子。
我不知道这是否是不好的做法,因为 Composer 不再“控制”供应商目录中的所有文件。
有大量关于如何制作 Composer 包的指南,但没有一个指南解释了在正在开发包的项目中构建文件的好方法。
以下是我为“获取错误”所做的操作(在 Project Foo 中):
创建新的类文件,例如:myhandle/mypackage/src/Test.php
然后我像这样实例化它:$test = new MyNamespace\MyPackageName\Test();
然后我收到错误:
致命错误:未捕获错误:未找到类“MyNamespace\MyPackageName\Test”
这就是 Project Bar 中的工作原理(完全相同的代码)。
我找不到有关如何在我正在开发的包中正确设置自动加载的指南。我正在使用这个自动加载文件,这是我在另一个作曲家项目中找到的。我已将其放在我的项目的根目录中。它看起来像这样:
<?php
namespace MyNamespace\MyPackageName;
spl_autoload_register(function($cls) {
$cls = ltrim($cls, '\\');
if (strpos($cls, __NAMESPACE__) !== 0) {
return;
}
$classWithoutBaseNamespace = str_replace(__NAMESPACE__, '', $cls);
// Load files from 'src' directory based on their class name without
// the StoutLogic\AcfBuilder namespace.
$path = dirname(__FILE__).
DIRECTORY_SEPARATOR.
'src'.
str_replace('\\', DIRECTORY_SEPARATOR, $classWithoutBaseNamespace).
'.php';
require_once($path);
});
我在 Composer 文档中找不到它,如何在新项目/包中设置它。不过,我可以找到无数关于如何使用自动加载的指南。
慕斯王