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

问题描述 投票:1回答:1

我正在开发一个包含多个Composer包的应用程序。

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

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

这不是问题。我只是在composer文件中将类型设置为“project”,因此可以使用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. 每次我要提交主应用程序repo时,我都需要更改主应用程序中的代码。这很麻烦,很容易错过一些东西
  2. 潜在的版本冲突。如果两个包依赖于获得新更新的同一个包。如果我错过了更新两者,可能会有版本冲突。 (这已经发生了)

拥有多个自动装载机永远不会有好处,因为这可能会让事情变得更加糟糕。

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

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

Edit

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

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

我不需要经历所有这一切,我每次都要更改扩展代码,只是为了看看更改是否有效。

php composer-php
1个回答
5
投票

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

你想要做的是让主项目包括子包作为实际包。你可以这样做:

1. Pushing them to a git host

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. Specifying a local repo

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或全局编写器配置中。

© www.soinside.com 2019 - 2024. All rights reserved.