我在我的项目中为 php 使用 Composer 依赖管理器。我正在构建我的项目以关闭名为 Concrete5 的开源 CMS。他们也在用 Composer 加载东西。
Concrete5 和我自己的使用 Doctrine 和 Doctrine 的包都包含在 composer.json 文件中。在两个不同的位置加载 Doctrine 时自动加载有问题吗?
我在我的项目中为 php 使用 Composer 依赖管理器。我正在构建我的项目以关闭名为 Concrete5 的开源 CMS。他们也在用 Composer 加载东西。
Concrete5 和我自己的使用 Doctrine 和 Doctrine 的包都包含在 composer.json 文件中。在两个不同的位置加载 Doctrine 时自动加载有问题吗?
Composer 和大多数其他自动加载器使用标准的 PHPspl_register_autoload()
函数来跟踪自动加载堆栈。这与 PSR-0 和 PSR-4 的规则相结合,使每个注册的自动加载器都有机会满足您的代码的依赖关系。
因此,当您有两个可以满足相同依赖关系的自动加载器时,无论哪个有机会首先响应,都会获胜。为了解决这个问题,spl_register_autoload
提供了一种将自动加载器预先添加到堆栈的方法,以便它们首先运行。使用 composer 这实际上是默认发生的,禁用它以便您可以加载依赖项的核心版本的方法是在包的prepend-autoloader
false
composer.json
.
{
"prepend-autoloader": false
}
另一个完全的选择是provide
在你的包composer.json
中为核心提供的依赖项定义正确的版本(你可以在 中找到它concrete/composer.lock
)。
{
"provide": {
"doctrine/dbal": "v2.5.1",
"doctrine/orm": "v2.4.8"
}
}
这将防止 Composer 拉下重复版本的依赖项,这样做的缺点是,当核心更新其依赖项时,您需要手动更新此列表。