作曲家包:如何要求供应商库自动加载

composer package : how to require vendor lib autoload

大约一年前,我打开了一个关于我喜欢的作曲家包的问题:jobby(它允许在 PHP 中管理 CRON 任务):see issue

我对这个包的问题是作曲家供应商的库被硬编码在一个名为 BackgroundJob.php ( see file )

的文件中
if (file_exists('vendor/autoload.php')) {
    require('vendor/autoload.php');
} else {
    require(dirname(dirname(dirname(dirname(dirname(__DIR__))))) . '/vendor/autoload.php');
}

但我的供应商目录不是 "vendor" 而是 "php/lib" 并且它是不可协商的 ;)

我丑陋的解决方案是硬编码自动加载文件的路径,但每次安装库时我都必须手动编辑 BackgroundJob.php。

由于供应商库可以是任何深度,我真的很想知道这个问题的最佳解决方案是什么:显然 Jobby 不是唯一需要 composer 的其他库的包 运行。你能告诉我一个处理这个问题的库吗,这样我就可以看看它或者告诉我你的想法?

谢谢

我认为除了 vendor 之外,将不属于您的软件包安装到另一个目录中既没有干净也没有好的解决方案,因为这是一个非常糟糕的主意。这是作曲家的设计!这是使作曲家很棒的一件事。有一个 nice article 关于为什么将软件包安装到 vendor 以外的目录是个坏主意的原因。

如果你有很好的理由,而不仅仅是 "but I want to ...",而且你真的真的需要这样做(我建议不要这样做!)但是你可以用 composer scripts 做一些技巧.应该可以 运行 post-package-updatepost-package-install 脚本将包从 vendor 移动到你想要的目录。

但请记住,每个开发人员都会讨厌您这样做。 vendor 是唯一的第三方包目录是有原因的。这不是为了好玩而限制。

这是一个糟糕的解决方案,但可以解决这个问题:

fork 该项目 => 更改代码 => 制作您的自定义包

稍后,您可以只安装自己的自定义包。