【问题标题】:composer autoload namespaces missing?缺少作曲家自动加载命名空间?
【发布时间】:2013-04-08 01:14:31
【问题描述】:

我正在开发一个使用 Monolog 的项目,该项目需要 Psr/log。 当我通过自动加载使用 Monolog 时,它会抱怨缺少 Psr\Log\LoggerInterface。 于是我查看了composer生成的autoload_namespaces.php,没有发现Psr被注册了。

这是我的 vendor/autoload_namespaces.php 的内容

return array(
'Symfony\\Component\\Process' => $vendorDir . '/symfony/process/',
'Monolog' => $vendorDir . '/monolog/monolog/src/',
'Imagine' => $vendorDir . '/imagine/Imagine/lib/',
'Gedmo' => $vendorDir . '/gedmo/doctrine-extensions/lib/',
'Gaufrette' => $vendorDir . '/knplabs/gaufrette/src/',
'Evenement' => $vendorDir . '/evenement/evenement/src',
'Doctrine\\ORM' => $vendorDir . '/doctrine/orm/lib/',
'Doctrine\\DBAL' => $vendorDir . '/doctrine/dbal/lib/',
'Doctrine\\Common' => $vendorDir . '/doctrine/common/lib/',
'Assetic' => $vendorDir . '/kriswallsmith/assetic/src/',
'Analog' => $vendorDir . '/analog/analog/lib/',
);

composer 是否应该为所有在 composer.json 文件中定义了 {autoload} 的项目注册命名空间? (我检查了 Monolog 和 Psr/Log,它们都定义了 {autoload}。)

还是我对作曲家的理解有误?

【问题讨论】:

    标签: composer-php


    【解决方案1】:

    Composer 根据项目的composer.json 文件中的autoload 注册类,例如

    {
      "autoload": {
        "classmap": [
          "path/to/FirstClass.php",
          "path/to/SecondClass.php"
        ]
      }
    }
    

    通常composer update 会自动重新生成autoload_namespaces.php 列出您的应用程序可以使用的所有命名空间(除非您使用多个自动加载器)。

    如果缺少命名空间,这里是直接更新作曲家自动加载器的命令:

    composer dump-autoload -o
    

    那么您需要确保在我们的脚本顶部包含自动加载器:

    <?php
    require_once __DIR__ . '/vendor/autoload.php';
    

    见:How to directly autoload classes with Composer?

    如果仍然失败,请仔细检查失败项目的 composer.json 文件中的语法(尤其是 autoload 部分)。要调试,请尝试使用-vvvXDebug 运行composer。

    【讨论】:

      【解决方案2】:

      我实际上对 autoload_namespaces.php 的数量感到困惑。 我在我的问题中发布的一个在vendor/,然后我在vendor/.composer/ 找到了另一个,最后在vendor/composer/ 找到了正确的一个。

      很抱歉回答了我自己的(愚蠢的)问题,但值得一提的是,以防其他开发人员遇到同样的问题。

      感谢@Chuan Ma 的回答。

      【讨论】:

      • 拥有这么多文件可能与使用非常旧的 Composer 版本的遗留问题有关(composer 的第一个 alpha 版本使用的位置与今天不同)
      【解决方案3】:

      你需要明确添加

      "psr/log": "1.0.0"
      

      在您的 composer.json 要求块中。 monolog/monolog 项目不需要 psr/log [你可以在 monolog 的 composer.json 文件中验证]。

      然后运行composer update 来更新您的自动加载器文件。

      [UPDATE] 出错了。

      我使用的是 monolog 1.2.*,它不需要psr/log。在独白 1.3.* 之后,它确实需要 psr/log。在这种情况下,composer 应该在 vendor/autoload_namespaces.php 中加载 psr/log 命名空间。

      例如,我刚刚更新了我的 composer.json 以拥有

      "monolog/monolog": "1.3.*",
      

      在要求块中。然后运行composer update monolog/monolog [你可以再次运行这个命令看看它是否解决了你的问题]

      Loading composer repositories with package information
      Updating dependencies (including require-dev)
        - Installing psr/log (1.0.0)
          Loading from cache
      
        - Removing monolog/monolog (1.2.1)
        - Installing monolog/monolog (1.3.1)
          Downloading: connection...
          Downloading: 100%
      

      然后在我的 vendor/composer/autoload_namespaces.php 中,我找到了这个正确的条目:

          'Psr\\Log\\' => $vendorDir . '/psr/log',
      

      这应该可行。有时我也只是跑

      composer dump-autoload
      

      再次重新生成 vendor/composer/autoload_namespaces.php 文件。

      【讨论】:

      • 我在 monolog 的 composer.json 文件中看到以下内容。还是我解释错了? "require": { "php": ">=5.3.0", "psr/log": "~1.0" }, github.com/Seldaek/monolog/blob/master/composer.json
      • 有一段时间没关注独白/独白了。你说的对。它应该自动设置 autoload_namespaces.php。我刚刚更新了我的答案。
      猜你喜欢
      • 2018-05-07
      • 2013-08-11
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 2016-11-30
      • 2018-08-30
      • 2014-09-13
      • 2016-08-03
      相关资源
      最近更新 更多