作曲家自动加载错误

时间:2016-03-22 05:33:13

标签: php composer-php packages

我尝试使用composer并创建自己的包。我的包项目具有以下文件结构:

scr/Scheduler.php
.gitignore
composer.json

测试类:

namespace david\Scheduler;

use Symfony\Component\Yaml\Parser;

class Scheduler
{
    private $yamlParser;

    public function __construct()
    {
        $this->yamlParser = new Parser();
    }
}

和composer.json文件

...
"require": {
    "symfony/yaml": "~3.0.3"
},
"autoload": {
    "psr-4": {
        "david\\Scheduler\\": "src/"
    }
}

我所有人都致力于私有github存储库。目前我只有主分支而没有标签。 我的第二步是使用以下composer.json文件创建一个客户端项目:

"repositories": [
    {
        "type": "package",
        "package": {
            "name": "david/scheduler",
            "type": "package",
            "version": "dev-master",
            "source": {
                "url": "git@github.com:david/scheduler.git",
                "type": "git",
                "reference": "master"
            }
        }
    }
],
"require": {
    "david/scheduler": "dev-master"
}

当我运行composer update时,github项目将被克隆并存储在vendor目录中。但只有我的包裹。不会加载对symfony / yaml的依赖。

vendor
    composer
    david/scheduler

另外,composer会创建一个空的autoload_psr4文件。

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

return array(
);

我想我的架构可能存在一些问题......

1 个答案:

答案 0 :(得分:1)

您的问题是您使用package类型注册自定义存储库,这意味着根包定义了david/scheduler的元数据,并且git repo中的composer.json文件永远不会由Composer使用。并且在此包定义中,不依赖于symfony/yaml组件,也没有自动加载Scheduler类。

作为一般规则,package存储库应始终被视为最后的手段(它有许多缺点)。当你控制git存储库时,将composer.json文件放在存储库中并使用vcs存储库工作得更好(因为作曲家可以依赖来自git本身的元数据,并且包中提供了包元数据) git repo)。

root包应如下所示:

{
    "repositories": [
        {
            "type": "vcs",
            "url": "git@github.com:david/scheduler.git"
        }
    ],
    "require": {
        "david/scheduler": "dev-master"
    }
}