我在我的网站上安装了自定义主题和 SMTP 插件,它们都包含用于不同目的的 Google API PHP 客户端。不幸的是,插件和主题使用的依赖是不同版本的,并且它们无法轻松升级或降级。
这会导致冲突,插件从主题加载包而不是自己的包,并抛出错误。
这是主题的作曲家。
{
"require": {
"google/apiclient": "^2.2.1"
},
"scripts": {
"pre-autoload-dump": "Google\\Task\\Composer::cleanup"
},
"autoload": {
"psr-4": {
"BH\\": "includes/"
}
},
"extra": {
"google/apiclient-services": [
"Sheets"
]
}
}
并且主题使用了命名空间BH
有没有办法限制使用 Composer 仅为主题执行的代码加载 Google API PHP 客户端文件(带有命名空间BH
)而不是使用不同名称空间的插件(例如ABC
).
请注意:我尝试过范围界定,但这使整个情况变得更加复杂。
有没有办法限制使用 Composer 仅为主题执行的代码加载 Google API PHP 客户端文件(带有命名空间BH
)而不是使用不同名称空间的插件(例如ABC
).
简而言之,不,Composer 中不存在这样的选项。 Composer 根据项目配置转储自动加载器(composer.json
以及以下所有内容vendor/*/composer.json
).
剩下的就是 PHP 中自动加载的工作原理:您使用一个类(或 Interface/Trait/Enum 等),如果尚未加载,则会咨询自动加载器以将类名解析为类定义(通常是磁盘上的文件)。然后该文件由 PHP 加载并解析(require
etc.).
所以这里没有太多魔法。您还可以看到,这取决于命名空间“加载”内容的执行顺序。顺便说一句,(默认)自动加载器。看不到(没有进一步的内省,由于效率原因没有进行)哪个命名空间实际上需要什么。
如果您想检查细节 - 特别是当您已经研究过范围界定时 - Composer 可以在运行时级别提供一些东西。
默认情况下,作曲家自动加载器是prefixed。这意味着它将自己添加到自动加载器队列的顶部。在 PHP 中,您可以有多个自动加载器实现。您可以在项目中配置 Composer,使其不将自身添加到队列顶部,而是添加到队列末尾。
这允许您在前面添加自己的自动加载器,例如,您可以使用它来诊断加载。它还允许您加载不同的内容,但只能加载具有相同类名的内容。
这就是为什么分叉和重写命名空间(又名“作用域”)通常效果更好,因为类名不同,然后冲突就消失了。
我尝试过界定范围,但这使整个情况变得更加复杂。
是的,确实如此,但请记住,归根结底这是依赖冲突。不从根本上解决问题只会迫使你继续采取变通办法。此类冲突在解决之前不会轻易消失。
是的,依赖管理很困难。我们已经说过编程很困难,但是当您遇到第一个依赖冲突时,还有另一个教训需要通过艰难的方式学习。这些不会神奇地消失,并且需要维护(我并不是指那些可以通过提升需求或类似方式轻松解决的依赖项冲突,而是指您依赖的那些依赖项,然后它们就会破坏)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)