我正在开发一个由多个作曲家包组成的应用程序。
首先,我有一个"主"应用程序(它将是Composer中的一个"项目"),它将包含所有必要的文件和文件夹:
app/
public/
index.php
logs/
config.php
..etc..
这不是问题。我只是在作曲家文件中将类型设置为"项目",以便可以使用composer create-project foo/bar
安装它。
我还将为主应用程序构建一些可选扩展。它们将是他们自己的作曲家包。这也不是问题。我只是将它们制作成"库"类型并使用composer install foo/the-extension
安装它们.
A. 问题
扩展将具有自己的命名空间,其中一些将具有自己的依赖项。其中一些甚至具有相同的依赖项.
这是必需的,因为它们都是可选的。您可以安装一个或另一个或全部。
目前,我在主应用程序中创建了一个名为"/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...
这有效,但它有一些缺点:
每次提交主- 应用程序存储库时,我都需要更改主应用程序中的代码。这很麻烦,很容易错过一些东西
- 潜在的版本控制冲突。如果两个包依赖于获取新更新的同一包。如果我错过了两者的更新,则可能会出现版本冲突。(这已经发生了)
拥有多个自动加载程序从来都不是一件好事,因为这会把事情搞砸。
那么,有谁知道处理这个问题的正确方法,或者它是"好吧,如果它对你有用,那就这样做">类型的情况之一?
一段时间以来一直在为此寻找一个好的解决方案,但还没有找到。如果我在SO上错过了一些答案,请将其标记为重复,我将删除此帖子。
编辑
正如@sammitch在下面的答案中指出的那样,我可以使用作曲家"存储库"键添加扩展。这将消除多个自动加载程序问题。但是,这将使开发流程非常尴尬:
- 对扩展进行更改
- 提交并将该更改推送到 git 存储库
- 您在主应用程序中执行
composer update
(以获取新提交) - 现在,您可以测试更改是否有效
我宁愿不需要每次更改扩展代码时都经历所有这些,只是为了查看更改是否有效。
哇哇哇
�您要做的是让主项目将子包作为实际包包含在内。您可以通过以下方式执行此操作:
1. 将它们推送到 git 主机
https://getcomposer.org/doc/05-repositories.md#loading-a-package-from-a-vcs-repository
{
"repositories": [{
"type": "vcs",
"url": "https://github.com/youruser/yourrepo"}],
"require": {
"youruser/yourpackage": "^1.0.0"
}
}
2. 指定本地存储库
作曲家需要本地包
{
"repositories": [{
"type": "vcs",
"url": "/home/youruser/src/yourrepo"
}],
"require": {
"youruser/yourpackage": "^1.0.0"
}
}
现在,您只需运行composer install
或composer update youruser/yourpackage
作曲家将拉入所有必需品并构建相关的自动加载机。
注意:存储库规范仅在根 composer.json 中有效,因此如果您的依赖项具有特定的存储库配置,则需要将该配置放入根 composer.json 或全局编辑器配置中。