Composer - 需要我的包/包中的另一个包,但它不会自动加载。解决了另外两种方式但不够干净

时间:2014-10-14 19:55:37

标签: symfony composer-php

我正在使用Symfony 2.3和Composer,并使用Composer从远程存储库安装我的捆绑包。单独执行此操作可以正常工作,但我遇到的问题是当我尝试从Symfony2包中需要另一个包时。

我的包位于src /文件夹中。

我已将此添加到我的包的composer.json:

"require": {
    "rackspace/php-opencloud": "1.10.*"
},

一切都安装但我现在需要确保类是自动加载的(我认为注册名称空间),但它不会这样做。

我实际上已经用另外两种方式解决了这个问题,但它们还不够干净。我希望我的bundle能够处理依赖项而不是app文件夹或主Symfony2 composer.json。

不够好的解决方案:

(1)如果我将Rackspace软件包添加到我的symfony2 / composer.json中,那么一切都运行良好。但这很糟糕,因为依赖是我的捆绑而不是整个Symfony2框架。

(2)如果我将这些添加到app / autoload.php,那么它也有效:

$loader->add('OpenCloud', __DIR__.'/../src/rackspace/php-opencloud/lib');
$loader->add('Guzzle\\Http', __DIR__.'/../src/guzzle/http');
$loader->add('Guzzle\\Common', __DIR__.'/../src/guzzle/common');

...但这很麻烦,依赖是捆绑而不是应用程序。

我尝试了各种各样的变体(在我的bundle的composer.json中),但它不起作用:

"autoload": {
    "psr-0": { "OpenCloud": ["rackspace/php-opencloud/lib/", "rackspace/php-opencloud/tests/"] }
}

1 个答案:

答案 0 :(得分:0)

通常,只需要相对路径。

"autoload": {
    "psr-0": { "OpenCloud": ["lib/", "tests/"] }
}

我没有使用多个路径测试相同的前缀。这可能不受支持。

您也可以使用classmap自动加载器,它将遍历整个文件夹并从中生成静态地图。无需前缀。

"autoload": {
    "classmap": ["lib/", "tests/"]
}

但我很少看到测试被包含在外部应用程序的自动加载中。 PHPUnit处理类加载就好了。