1

composerパッケージの作り方を学んでいます。これまでのところ、私はこれを行ってきました:

composer.json

{
  "name": "Iv/MyPackage",
  "autoload": {
    "psr-4": {
      "Iv\\MyPackage\\": "src/"
    }
  },
  "require": {
    "guzzlehttp/guzzle": "~6.0"
  },
  "require-dev": {
    "phpunit/phpunit": "4.*",
    "guzzlehttp/guzzle": "~6.0"
  },
  "autoload-dev": {
    "psr-4": {
      "Iv\\MyPackage\\Tests\\": "tests/"
    }
  }
}

そして、私は名前空間の下にクラスを持っています:namespace Iv\MyPackage\Api;と呼ばConsumerれ、その__constructメソッドにはこれがあります:

public function __construct(array $credentials)
{
    $this->client = new Client();
    $this->credentials = $credentials;
}

そして、そのクラスの一番上にuse GuzzleHttp\Client;.

私が得ているエラーは次のとおり Fatal error: Class 'GuzzleHttp\Client' not found in path\to\package\Iv\MyPackage\src\Api\Consumer.php on line 27です。

$package = new Iv\MyPackage\Api\Consumer(['user', 'password']);
$query = $api->prepare('/api-endpoint', 'GET');

編集

これは私のConsumerクラスがどのように見えるかです:

<?php

namespace Iv\MyPackage\Api;


use GuzzleHttp\Client;
class Consumer
{
    private $credentials = [];

    public function __construct(array $credentials)
    {
        $this->client = new Client();
        $this->credentials = $credentials;
    }
    ...
}

また、PhpStorm を使用しています。これは、+を入力して押すとGuzzleHttpパッケージが自動インポートされるため、パッケージがあることを示しています。つまり、私は走った。Client()ALTENTERcomposer install/update

編集2:ファイルがあります-index.php次のものがあります:

<?php
include('vendor/autoload.php');

$api = new Iv\MyPackage\Api\Consumer(['user', 'password']);

$query = $api->prepare('/endpoint', 'GET');

var_dump($api->execute($query));

フォルダ構造は次のとおりです。

-Iv/
--MyPackage/
---src/
----Api/
----Exceptions/
----vendor/
----tests/
----otherfiles (composer.json, phpunit.xml, etc)
-vendor/
-composer.json
-index.php (I mentioned above)

編集 3 : my の内容vendor/composer/autoload_psr4.php:

<?php

// autoload_psr4.php @generated by Composer

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

return array(
    'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'),
    'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
    'Iv\\MyPackage\\Tests\\' => array($baseDir . '/tests'),
    'Iv\\MyPackage\\' => array($baseDir . '/src'),
    'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'),
    'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'),
    'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),
    'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'),
);

編集4

index.phpこの作曲家がいるフォルダーには:

{
  "name": "Test MyPackage",
  "autoload": {
    "psr-4": {"Iv\\MyPackage\\": "Iv/MyPackage/src"}
  }
}

^^ SO のトピックで、OP がパッケージを packagist/git にアップロードする前にパッケージをテストする方法を尋ねているのを見ました。クラスをロードできますが、Consumerエラーはありませんが、すべての依存関係が見つかりません。( GuzzleHttp\ClientSymfony\Component\Yaml\Parser、など)

4

2 に答える 2

1

composer.jsonメイン ディレクトリに、パッケージへの参照がありません。オートロードしているだけですが、すべての依存関係をオートロードしているわけではありません。

これを行うにcomposer.jsonは、メイン ディレクトリに次のようなセクションを追加する必要があります。

"repositories": [
    {
        "url": "path/to/your/package",
        "type": "path"
    }
]

それをセクションに追加します。次のrequireようなものです。

"require": {
    "Iv/MyPackage" : "dev-master"
}

composer.jsonまたは、依存関係をパッケージ内からメインディレクトリの依存関係に移動することもできます

于 2015-11-26T19:20:54.877 に答える
0

すべてを少し混同したと思いますが、解決可能です。

私が見ているのは、あなたが奇妙なディレクトリ構造を持っていることです.あなたはIv/MyPackage/src/...メインプロジェクトにあります(つまり、同じレベルにファイルがありますcomposer.json)。

「Iv/MyPackage」をメイン プロジェクトで Composer パッケージとして使用する場合は、依存関係として追加する必要があります。これは、パッケージ名がメインファイルの"require"-Section内にある必要があることを意味します。composer.json現在、そうではありません。これの代わりに、パッケージが現在入っているパスに自動読み込みを手動で追加しました。Composer に、これをパッケージとして扱う必要があり、ダウンロードする必要がある依存関係があることを伝えていません。

パッケージの依存関係をそのディレクトリ内に追加しましたが、これは Composer の動作ではありません。

これを修正するには、次の 2 つの簡単な操作を行う必要があります。

  1. パッケージを依存関係として main に追加しますcomposer.json
  2. パッケージが現在プライベート リポジトリでホストされている場合は、その URL を のrepositoriesキーに追加する必要がありますcomposer.json

最初のものはこれだけです:

{
  "name": "Test MyPackage",
  "require": {
    "Iv/MyPackage": "dev-master"
  },
  "autoload": {
  }
}

パッケージのオートローディングを削除します - それはすでにそのパッケージ内に含まれています。Composer にメイン プロジェクトを自動ロードさせたい場合は、その自動ロードをここに追加します (おそらく、より優れたオートローダーを自分で作成することはできないため、追加することをお勧めします)。

2 つ目は、リポジトリを追加することです。

{
  "name": "Test MyPackage",
  "repositories": [
    { 
      "type": "vcs", 
      "url": "your repo url, either http or ssh" 
    }
  ],
  "require": {
    "Iv/MyPackage": "dev-master"
  },
  "autoload": {
  }
}

これにより、Composer はそのリポジトリを調べて、何かが見つかるかどうかを確認します。見つかったものはすべて、既知のパッケージのコレクション (デフォルトのソースは Packagist) に追加され、最適なバージョンの一致を選択するために使用されます。

適用する必要があるいくつかの修正:

  1. パッケージ名は小文字にする必要があるため、iv/mypackage.
  2. メイン プロジェクトで名前を付ける場合は、<vendor>/<package>名前付きのランダムな文字列ではなく、形式に従う必要があります。Composer は動作を否定しませんが、一度そこに到達すると、Composer 領域で利用可能なインフラストラクチャをより多く利用できるようになり、正しい名前が役に立ちます。それ以外の場合は、しばらく放置してください。

これで準備が整い、実行できるはずです。おそらく、あなたが聞いてもいない詳細についてお答えできると思いますが、一般的な問題は通常、既に解決されているため、ドキュメンテーション ページまたは Stackoverflow で Composer について読むことをお勧めします。

于 2015-11-26T19:43:49.800 に答える