2016-12-20 15 views
2

私は、インストールまたはアップデート後に実行できるカスタムコマンドを追加するコンポーザープラグインに取り組んでいます。作者プラグイン自動暴行

私はオートローディングの設定を理解しています。コンポーザーはすべてのクラスをオートロードしていますが、名前空間付きの関数だけを含んでいるファイルもありません。私のプラグイン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を使ってうまく始まります。

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 Fatal error: Call to undefined function Aws\manifest() in .../test/vendor/aws/aws-sdk-php/src/AwsClient.php on line 143

私はAWSのcomposer.jsonに自動ロード設定を見ることができますが、私はS3Clientをインスタンス化しようとすると、

の問題は、ここに来て正しいです:

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

Aws \ manifest関数はfunctions.phpで宣言されています。そしてfunctions/phpはvendor/composer/autoload_files.phpで指定されます。しかし、私はファイルが読み込まれていないことを伝えることができます。だから私の依存関係のすべてが実際に利用できるわけではありません。

私の欠点は何ですか?autoload_files.phpが含まれていますか?私は、ベンダーのフォルダ内の何にもインクルードすることは一切していません。私は作曲家がそれを私のために処理すると仮定しています。しかし、私は間違っていると思う。

答えて

0

an issue at the Composer Github repoを投稿した後、私は、作曲家の実行中に実行されるオートローダーにはクラスしか含まれていないことを知りました。したがって、ゆるい関数を含める必要がある場合は、フルオートローダーを手動で実行する必要があります。

次のメソッドを、Composerによってロードされ、プラグインのcomposer.jsonのextraセクションで定義されたCommandクラスに追加しました。

private function getIncludes() { 
    $vendorDir = $this->composerInstance->getConfig()->get('vendor-dir'); 
    require $vendorDir . '/autoload.php'; 
} 

私はプラグインコンストラクタで呼び出すだけで、必要なものはすべて利用可能になります。

関連する問題