如何在开发多个包时处理多个作曲家自动加载程序



我正在开发一个由多个作曲家包组成的应用程序。

首先,我有一个"主"应用程序(它将是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...

这有效,但它有一些缺点:

每次提交主
  1. 应用程序存储库时,我都需要更改主应用程序中的代码。这很麻烦,很容易错过一些东西
  2. 潜在的版本控制冲突。如果两个包依赖于获取新更新的同一包。如果我错过了两者的更新,则可能会出现版本冲突。(这已经发生了)

拥有多个自动加载程序从来都不是一件好事,因为这会把事情搞砸。

那么,有谁知道处理这个问题的正确方法,或者它是"好吧,如果它对你有用,那就这样做">类型的情况之一?

一段时间以来一直在为此寻找一个好的解决方案,但还没有找到。如果我在SO上错过了一些答案,请将其标记为重复,我将删除此帖子。

编辑

正如@sammitch在下面的答案中指出的那样,我可以使用作曲家"存储库"键添加扩展。这将消除多个自动加载程序问题。但是,这将使开发流程非常尴尬:

  1. 对扩展进行更改
  2. 提交并将该更改推送到 git 存储库
  3. 您在主应用程序中执行composer update(以获取新提交)
  4. 现在,您可以测试更改是否有效

我宁愿不需要每次更改扩展代码时都经历所有这些,只是为了查看更改是否有效。

哇哇哇

�您要做的是让主项目将子包作为实际包包含在内。您可以通过以下方式执行此操作:

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 installcomposer update youruser/yourpackage作曲家将拉入所有必需品并构建相关的自动加载机。

注意:存储库规范仅在根 composer.json 中有效,因此如果您的依赖项具有特定的存储库配置,则需要将该配置放入根 composer.json 或全局编辑器配置中。

相关内容

  • 没有找到相关文章

最新更新