【问题标题】:Composer - require another package from my package/bundle but it just won't autoload. Solved in two other ways but not clean enoughComposer - 需要我的包/包中的另一个包,但它不会自动加载。以其他两种方式解决但不够干净
【发布时间】:2014-10-14 19:55:36
【问题描述】:

我正在使用 Symfony 2.3 和 Composer,并使用 Composer 从远程存储库安装我的包。自己做这件事很好,但我遇到的问题是当我尝试从我的 Symfony2 包中要求另一个包时。

我的包在 src/ 文件夹中。

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

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

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

我实际上已经通过其他两种方式解决了这个问题,但是它们不够干净。我希望我的包处理依赖关系而不是应用程序文件夹或主要 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/"] }
}

【问题讨论】:

    标签: symfony composer-php


    【解决方案1】:

    通常,只需要相对路径。

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

    我没有针对同一个前缀使用多个路径进行测试。这可能不受支持。

    您也可以使用类映射自动加载器,它会遍历整个文件夹并从中生成静态映射。不需要前缀。

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

    但是,我很少看到外部应用程序的自动加载中包含测试。 PHPUnit 可以很好地处理类加载。

    【讨论】:

    • 感谢您的帮助。不幸的是,这一切都没有影响。但是,我发现实际上一切都按照我的意愿进行了配置,但问题出在其他问题上。在 src/composer/autoload_namespaces.php 中,它已经按照我的预期配置了所有内容。问题是它不运行/识别 autoload_real.php 文件(它使用 autoload_namespace.php 文件)。它只是忽略它。我已经通过强制使用它进行了测试(非常肮脏的方法)。如何让 autoload_real.php 默认运行。 vendor/composer/autoload_real.php 默认运行。
    • Composer 构建自动加载文件。不应手动编辑它们。
    猜你喜欢
    • 2016-06-10
    • 1970-01-01
    • 2013-06-16
    • 2018-11-03
    • 2017-06-15
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 2013-02-17
    相关资源
    最近更新 更多