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

时间:2018-03-01 21:03:41

标签: php composer-php

我正在开发一个由多个Composer软件包组成的应用程序。

首先,我有#34;主要"应用程序(它将是一个"项目"在Composer中),它将包含所有必需的文件和文件夹:

app/
public/
    index.php
logs/
config.php
..etc..

这不是问题。我只是将类型设置为" project"在composer文件中,因此可以使用composer create-project foo/bar进行安装。

我还将为主应用程序构建一些可选扩展。它们将是他们自己的Composer包。这不是一个问题。我只是将它们变成类型"库"并使用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...

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

  1. 每次我要提交主应用程序仓库时,我都需要更改主应用程序中的代码。这很麻烦,很容易错过一些东西
  2. 潜在的版本冲突。如果两个包依赖于获得新更新的同一个包。如果我错过了更新两者,可能会有版本冲突。 (这已经发生了)
  3. 拥有多台自动装载机从来都不是好事,因为这可能会让事情变得更加糟糕。

    那么,有没有人知道处理这个问题的正确方法,或者是其中一个"好吧,如果它对你有用,就这样做" -type情况?

    现在一直在寻找一个好的解决方案但是没有发现任何问题。如果我在这里错过了一些答案,请将其标记为重复,我将删除此帖。

    修改

    正如@sammitch在下面的答案中指出的那样,我可以使用Composers" repositories"添加扩展名。键。这将删除多个自动加载器问题。但是,这将使开发流程变得非常尴尬:

    1. 您对扩展程序进行了更改
    2. 您提交并将该更改推送到git repo
    3. 您在主应用中执行composer update(以获取新提交)
    4. 现在您可以测试您的更改是否有效
    5. 我不需要每次都更改扩展代码,只是为了查看更改是否有效。

1 个答案:

答案 0 :(得分:5)

哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇/ p>

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

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。指定本地仓库

Composer require local package

{
    "repositories": [{
        "type": "vcs",
        "url": "/home/youruser/src/yourrepo"
    }],
    "require": {
        "youruser/yourpackage": "^1.0.0"
    }
}

现在你可以简单地运行composer installcomposer update youruser/yourpackage,作曲家将提供所有必需品并构建相关的自动加载器。

注意:存储库规范仅在根composer.json中有效,因此如果您的依赖项具有特定的repo配置,则需要将该配置放入根composer.json,或者你的全球作曲家配置。