我正在开发一个由多个Composer软件包组成的应用程序。
首先,我有一个“main”应用程序(它将是Composer中的一个“项目”),它将包含所有必要的文件和文件夹:
app/
public/
index.php
logs/
config.php
..etc..
这不是问题。我只是在composer文件中将类型设置为“project”,这样就可以使用
composer create-project foo/bar
.
我还将为主应用程序构建一些可选扩展。它们将是自己的作曲家软件包。这也不是问题。我只是把它们做成“library”类型,然后用
composer install foo/the-extension
.
问题
这些扩展将有自己的名称空间,其中一些将有自己的依赖项。其中一些甚至具有相同的依赖关系。
这是必需的,因为它们都是可选的。您可以安装一个或另一个或全部。
目前,我已经在主应用程序中创建了一个名为“/dev”的新文件夹,在该文件夹中,我在开发时拥有所有扩展。然后,在主应用程序中,我加载所有扩展自动加载程序:
# Main apps autoloader
require_once __DIR__ . '/vendor/autoload.php';
# Extensions
require_once __DIR__ . '/dev/foo/vendor/autoload.php';
require_once __DIR__ . '/dev/bar/vendor/autoload.php';
...etc...
这是可行的,但也有一些缺点:
-
每次我要提交到主应用程序repo时,我都需要更改主应用程序中的代码。这很麻烦,很容易错过一些东西
-
潜在的版本控制冲突。如果两个包依赖于获取新更新的同一个包。如果我未能同时更新这两个版本,可能会出现版本冲突。(这已经发生了)
拥有一台以上的自动装载机从来都不是好事,因为那样会把事情搞得一团糟。
那么,有没有人知道处理这个问题的正确方法,或者是其中之一
“好吧,如果对你有用的话,就这样做吧”
-情况类型?
一直在寻找一个很好的解决方案,但没有找到任何。如果我错过了一些答案,请将其标记为重复,我将删除此帖子。
编辑
正如@sammitch在下面的回答中指出的,我可以使用Composer“repositories”键添加扩展。这将消除多自动装载机问题。然而,这将使开发流程非常尴尬:
-
您对扩展进行了更改
-
您将更改提交并推送到git回购
-
你做了一个
composer update
在主应用程序中(获取新提交)
-
现在,您可以测试更改是否有效
我不需要每次更改扩展代码时都检查所有这些内容,只是为了看看更改是否有效。