Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在开发多个软件包时处理多个composer自动加载程序_Php_Composer Php - Fatal编程技术网

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

Php 如何在开发多个软件包时处理多个composer自动加载程序,php,composer-php,Php,Composer Php,我正在开发一个由多个作曲家软件包组成的应用程序 首先,我有一个“主”应用程序(它将是Composer中的一个“项目”),它将包含所有必要的文件和文件夹: app/ public/ index.php logs/ config.php ..etc.. 这不是问题。我只是在composer文件中将类型设置为“project”,这样就可以使用composer-createprojectfoo/bar安装它 我还将为主应用程序构建一些可选的扩展。他们将是自己的作曲家包。这也不是问题。我只是将它

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

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

app/
public/
    index.php
logs/
config.php
..etc..
这不是问题。我只是在composer文件中将类型设置为“project”,这样就可以使用
composer-createprojectfoo/bar
安装它

我还将为主应用程序构建一些可选的扩展。他们将是自己的作曲家包。这也不是问题。我只是将它们输入到类型“library”中,并使用
composer install foo/扩展名安装它们

问题 扩展将有自己的名称空间,其中一些将有自己的依赖项。它们中的一些甚至具有相同的依赖关系。
这是必需的,因为它们都是可选的。您可以安装一个或另一个或全部

目前,我在主应用程序中创建了一个名为“/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在下面的回答中指出的,我可以使用Composers“repositories”键添加扩展。这将消除多自动装载机问题。然而,这将使开发流程变得相当尴尬:

  • 您对分机进行了更改
  • 您可以提交更改并将其推送到git回购
  • 在主应用程序中执行
    composer更新
    (以获得新提交)
  • 现在,您可以测试更改是否有效

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

    哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇

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

    1.将它们推送到git主机

    2.指定本地回购

    现在,您只需运行
    composer安装
    composer更新您的用户/软件包
    ,composer就可以导入所有必需的内容并构建相关的自动加载器


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

    是的,我知道有多个自动加载程序是不好的,这就是我声明的原因“拥有多个自动装弹机从来都不是好事。“:-)这两种方法的问题是,它会使开发流程变得笨拙。每次我做出改变时,我都需要做一次git推送,以便能够测试它是否有效。它还要求我在每次提交到主应用程序时删除这些作曲家行。这是一种比我现在做的更好的方法,但仍然是次优的。尽管我意识到这可能是不可能的,但我更希望让composer检查
    /dev
    文件夹是否存在,如果存在,请加载其中的任何包。我知道这是额外的步骤,但您需要遵循与代码部署方式相匹配的一致工作流,否则在尝试通过composer部署成品时会遇到意想不到的问题。例如:缺少和/或不匹配的依赖项,在依赖库中手动进行的更改从未实际推送,或被标记为不同的版本,等等。我完全同意,这是我不喜欢现在的方式的主要原因。我以前也这样做过,但是在多个扩展上工作,特别是在一开始,做很多小的更改是一个很大的痛苦。我也不喜欢将未经测试的代码提交到repo的想法,因为这会使提交历史变得不干净。我可以在之后压缩提交,但这将是一个额外的步骤。也许没有更好/更流线型的方法来完成它。这就解释了为什么我在寻找落选选民时没有找到更好的答案。如果你觉得这个问题质量太差,你想投反对票,请添加一条评论,解释原因。如果你不知道问题出在哪里,就很难解决这个问题。
    {
        "repositories": [{
            "type": "vcs",
            "url": "https://github.com/youruser/yourrepo"}],
        "require": {
            "youruser/yourpackage": "^1.0.0"
        }
    }
    
    {
        "repositories": [{
            "type": "vcs",
            "url": "/home/youruser/src/yourrepo"
        }],
        "require": {
            "youruser/yourpackage": "^1.0.0"
        }
    }