代码之家  ›  专栏  ›  技术社区  ›  M. Eriksson

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

  •  -4
  • M. Eriksson  · 技术社区  · 8 年前

    我正在开发一个由多个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...
    

    这是可行的,但也有一些缺点:

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

    拥有一台以上的自动装载机从来都不是好事,因为那样会把事情搞得一团糟。

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

    一直在寻找一个很好的解决方案,但没有找到任何。如果我错过了一些答案,请将其标记为重复,我将删除此帖子。

    编辑

    正如@sammitch在下面的回答中指出的,我可以使用Composer“repositories”键添加扩展。这将消除多自动装载机问题。然而,这将使开发流程非常尴尬:

    1. 您对扩展进行了更改
    2. 您将更改提交并推送到git回购
    3. 你做了一个 composer update 在主应用程序中(获取新提交)
    4. 现在,您可以测试更改是否有效

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

    1 回复  |  直到 6 年前
        1
  •  8
  •   Sammitch    8 年前

    哇哇,你应该永远 一 composer autoloader,而仅仅塞入这样的外部依赖项是一个坏主意,因为这将使您的开发和/或部署管道稍后变得复杂。

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

    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 install 或 composer update youruser/yourpackage 作曲家会把所有必要的东西都放进去,然后建造相关的自动装弹机。

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

    推荐文章