我在我的项目中使用了用于php的Composer依赖项管理器。我将我的项目建立在名为Concrete5的开源CMS上。他们也在使用Composer加载东西。
Concrete5和我自己的包使用Doctrine和Doctrine包含在composer.json文件中。在两个不同的位置加载Doctrine时,我在自动加载方面有问题吗?
答案 0 :(得分:1)
Composer和大多数其他自动加载器使用标准的PHP spl_register_autoload()
函数来跟踪自动加载堆栈。结合PSR-0和PSR-4的规则,每个注册的自动加载器都有机会实现代码的依赖。
因此,当您有两个可以实现相同依赖关系的自动加载器时,无论哪个都有机会响应第一次获胜。为了解决这个问题,spl_register_autoload
提供了一种方法,可以将自动加载器添加到堆栈中,以便它们首先运行。使用composer,这实际上是默认情况下发生的,禁用它的方式是为了让你可以加载依赖项的核心版本是set prepend-autoloader
to false
in your package's composer.json
。
{
"prepend-autoloader": false
}
完全另一个选择是在软件包composer.json
中定义provide
,并为核心提供的依赖项提供适当的版本(可以在concrete/composer.lock
中找到)。
{
"provide": {
"doctrine/dbal": "v2.5.1",
"doctrine/orm": "v2.4.8"
}
}
这将阻止编写器删除重复版本的依赖项,其缺点是当核心更新其依赖项时,您需要手动保持此列表最新。