所以我正在编写一个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?我没有对供应商文件夹中的任何内容进行单一包含。我假设作曲家会为我处理这个问题。但我想我错了。
答案 0 :(得分:1)
所以在发布an issue at the Composer Github repo之后,我确实知道在编写器执行期间运行的自动加载器只包含类。因此,如果您确实需要包含松散功能,则必须手动运行完整的自动加载器。
我将以下方法添加到我的Command类中,该类由composer加载并在插件的composer.json的$row['b_nm']=Game Of Thrones
部分中定义。
extra
我只是在我的插件构造函数中调用它,我需要的所有内容都可用。