Composer插件自动加载依赖

时间:2016-12-20 20:04:01

标签: php composer-php

所以我正在编写一个composer插件,它添加了一个可以在安装或更新后运行的自定义命令。

我理解自动加载配置,而作曲家会自动加载所有类,但它也缺少一个只包含命名空间函数的文件。

在我的插件composer.json中,我有以下内容:

{
    "name": "myco/composer-s3-downloader",
    "type": "composer-plugin",
    "version": "0.1",
    "require": {
        "composer-plugin-api": "1.1.*",
        "aws/aws-sdk-php": "3.20.*"
    },
    "autoload": {
        "psr-4": {"MyCo\\Composer\\": "MyCo/"}
    },
    "extra": {
        "class": "MyCo\\Composer\\S3Downloader"
    }
}

我的插件类加载没有问题。我的依赖项的所有类也加载没有问题。所以我的插件命令代码使用AWS SDK就可以了。

当我尝试实例化S3Client时,问题就出现了:

private function initClient() {
   if (is_null($this->_s3Client)) {
        $this->_s3Client = new \Aws\S3\S3Client([
            "version" => "latest",
            "region" => 'us-west-2',
            "credentials" => [
            "key" => $this->_creds['key'],
            "secret" => $this->_creds['secret'],
            ]]);
    }
}

我收到以下错误:

  

PHP致命错误:调用未定义的函数Aws \ manifest()   在第143行的... / test / vendor / aws / aws-sdk-php / src / AwsClient.php

我可以在AWS composer.json中看到自动加载配置并且它是正确的:

"autoload": {
    "psr-4": {
        "Aws\\": "src/"
    },
    "files": ["src/functions.php"]
}

Aws \ manifest函数在functions.php中声明。然后在vendor / composer / autoload_files.php中指定functions.php。但接近我可以告诉该文件没有被加载。因此,并非所有依赖项都可用。

我错过了哪一步强制包含autoload_files.php?我没有对供应商文件夹中的任何内容进行单一包含。我假设作曲家会为我处理这个问题。但我想我错了。

1 个答案:

答案 0 :(得分:1)

所以在发布an issue at the Composer Github repo之后,我确实知道在编写器执行期间运行的自动加载器只包含类。因此,如果您确实需要包含松散功能,则必须手动运行完整的自动加载器。

我将以下方法添加到我的Command类中,该类由composer加载并在插件的composer.json的$row['b_nm']=Game Of Thrones部分中定义。

extra

我只是在我的插件构造函数中调用它,我需要的所有内容都可用。