【问题标题】:autoload psr-4 gets lost during installautoload psr-4 在安装过程中丢失
【发布时间】:2014-08-18 02:10:13
【问题描述】:

这是我的包的 composer.json(缩短)

{
    "name": "acme/my-bundle",
    "type": "library",
    "version": "0.5.0",
    "autoload": {
        "psr-4": {
            "Acme\\MyBundle\\": ""
        }
    }
}

在我的项目中:

"require": {
    "acme/my-bundle": "dev-master"
},

然后我运行composer install 导致一个installed.json 像

[
    {
        "name": "acme/my-bundle",
        "version": "dev-master",
        "version_normalized": "9999999-dev",

        "type": "library",
        "installation-source": "source"
        //
        // here must be this:
        // "autoload": {
        //    "psr-4": {
        //        "Acme\\MyBundle\\": ""
        //    }
        // },
        // but these lines are missing!
        //
    }
]

还有一个 autoload-psr4.php:

<?php

// autoload_psr4.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    /* here must be this:
     * 'Acme\\MyBundle\\' => array($vendorDir . '/acme/my-bundle'),
     * but this line is missing!
     */
);

自动加载消失了,还有其他键,如require

我错过了什么?

我也尝试了 psr-0,但没有成功。 autoload_namespaces.php 只是一个空数组。

【问题讨论】:

  • 如果缺少该行,那么 Composer 会安装一个提交,但在您的存储库中缺少这些行。您可能搞砸了 Composer 版本检测,因为您显然使用 Git 进行版本控制,但确实在 composer.json 中明确指定了一个版本。我还不清楚还有什么问题,但这是我的声明:在使用可以实际标记版本的版本控制系统时,永远不要在 composer.json 中指定版本。您可能应该删除供应商文件夹和 composer.lock 文件并运行 composer update 来尝试解决此问题。
  • @Sven:每次尝试后我都完全删除了 composer.lock 和 vendor 文件夹。已找到解决方案。

标签: composer-php autoload psr-0 psr-4


【解决方案1】:

我没有提到,我想从私人仓库中获取一个包!这将有所作为!

所以我不得不重新指定自动加载

"require": {
    "acme/my-bundle": "dev-master"
},
"repositories": [
    {
        "type": "package",
        "package": {
            "version": "dev-master",
            "name": "acme/my-bundle",
            "source": {
                "url": "ssh://git@example.com/acme/my-bundle",
                "type": "git",
                "reference": "test"
            }, 
            //    THIS IS      |
            //    ADDITIONAL   V
            "autoload": {
                "psr-4": {
                    "Acme\\MyBundle\\": ""
                }
            }
        }
    }
]

https://stackoverflow.com/a/24193122/816362 谢谢@zacharydanger

【讨论】:

  • 好吧,那你可能做错了。如果您将项目指定为“vcs”存储库,则 Composer 将能够自动检测项目的 composer.json"type": "vcs", "url":"ssh://git@example.com/acme/my-bundle"。然后 Composer 将使用这个项目的自动加载的定义。但是,如果您使用包类型,则必须在其中指定所有内容并独立于其他库进行维护。这对维护来说是个坏主意。
猜你喜欢
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
  • 2018-09-10
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
相关资源
最近更新 更多