2016-06-17 6 views
2

私はちょうど作曲家を始めています。私は、Composerのデフォルトを使用して、のPackagist からパッケージをダウンロードしてインストールするときに、Composerの動作を正しく理解したいと考えています。これは正しいです:作曲家:要求とオートローダの違いは何ですか?

  1. composer.jsonファイルの「要求」セクションでは、ダウンロードしてPackagistからをインストールするパッケージを指定します。「必要」セクションに記載されているパッケージのみがダウンロードされ、インストールされます。
  2. ステップ#1のダウンロードおよびインストールプロセス中に、は、デフォルトのvendorフォルダ(ダウンロードおよびインストール中にプロジェクトのルートに作成されます)内に作成されます。このファイルには、ダウンロードされ、インストールされた各パッケージの名前空間定義がファイルシステム上のフォルダにマップされています。
  3. ステップ#1でダウンロードしたファイルに含まれるクラスは、autoload_namespaces.php'sの名前空間でしかアクセスできません。各ダウンロードファイルにはNAMESPACE DEFINITIONそれはautoload_namespaces.php'sのNAMESPACESと一致します。 ダウンロードしたファイル内に名前空間定義が存在しない場合、ファイル内のクラスはGLOBAL名前空間に割り当てられます。
  4. composer.jsonファイルの "Autoloader"セクションは、カスタム名前空間を定義し、それらのカスタム名前空間をファイルシステム上のフォルダにマップするためにのみ使用されます。ダウンロードしてインストールしたパッケージの名前空間はautoload_namespaces.phpファイル内のNAMESPACEのPRESENTがで重複しないと仮定すると、唯一のautoload_namespaces.phpファイルを定義し、composer.jsonの「オートローダ」SECTIONによっていかなる影響を受けることはありませんcomposer.json「オートローダー」セクション。

上記の項目について私の理解は正しいですか?そうでない場合は、私を修正してもらえますか?

ありがとうございました -

答えて

1

いくつか間違っています。

広告1 .:

インストールまたは更新するとき--no-devフラグを使用してこれを防ぐ場合を除きもインストールされますrequire-devセクションがあります。また、パッケージ名は必ずしもPackagistに公開されているものと必ずしも繋がっていないことに注意してください。repositoriesという別のソースを指すセクションもあります。

広告2:

vendor/autoload.phpを超えたすべてのファイルの作成は作曲の内部にある、そしてあなたはそれを台無しべきではありません。作者はすべてautoloadautoload-devの定義を読んで(--no-devが与えられていない限り)、そこからコンパイルし、適切なオートローダーをコンパイルします。これには、他のパッケージにはrequirerequire-devがすべて含まれているメインソフトウェアが含まれます。

コンパイルは、定義されている自動ロードのタイプ(PSR-4、PSR-0、クラスマップまたはファイル)によって異なる動作をします。

広告3:

パッケージはautoloadセクションを持っていない場合は、任意のコードが自動的にロードすることはできません。パッケージの作成者がすべて正しく行ったと仮定すると、オートローディングのタイプ(PSR-4、PSR-0、クラスマップまたはファイル)に応じて、オートローディングが正しく行われると見なすことができます。

パッケージには、自動読み込みのための複数のエントリが含まれていてもよく、複数の名前空間の責任を負う可能性があります。 autoload_namespaces.phpのエントリは、一般的にComposerのオートローディングを理解するのには無関係です。パッケージにはオートロードが定義されており、パッケージにはvendor/autoload.phpが含まれており、ドキュメントにはクラスWhateverNamespace\Fooがあり、単に$class = new WhateverNamespace\Foo()またはuse WhateverNamespace\Foo; $class = new Foo()

パッケージ名から名前空間への接続、または名前空間からフォルダ名への接続を想定しないでください。 Composerの場合、すべての名前を違う名前にすることはできますが、Composerでは、GreatVendor/Awesomeというパッケージに名前空間GreatVendor\Awesomeまたはそのような名前のフォルダレイアウトを使用する必要があります。クラスマップを使用すると、任意のクラスを任意のファイルでホストすることができ、さらに1つのクラスを1つのファイルでホストすることができ、include/require(_once)を使用してコードを組み込むことができます。

最近のパッケージは、PSR-4または少なくともPSR-0に固執して名前空間を使用するのが一般的です。しかし、これの起源はComposerからではなく、コード自体から来ていることに注意してください。 Composerは、定義された自動ロード定義のみを実行し、それに応じて動作します。変更された名前空間などに魔法の影響を与えることはありません。基本的なPHPですが、一般的なオートローダーに必要な場合にクラスを見つける方法を教えてくれる共通インターフェースが追加されています。

広告4:

「カスタム名前空間」はありません。ここで「習慣」とはどういう意味ですか? autoloadセクションは記述されたコードと一致しなければなりません。Composerを使用してコード内の名前空間を異なるものに変更することはできません。

autoload_namespaces.phpは、自動ロード定義の唯一のソースではありません。

Composerは重複する名前空間エントリをうまく処理します。クラスが重複して定義されている場合は失敗する必要がありますが、名前空間接頭辞に重複がある場合(GreatVendorが2つのパッケージGreatVendor\CacheGreatVendor\Dbの2つのパッケージで使用されている場合)、Composerはそれらを区別します。

+0

作曲家について私が忘れていたことを教えてくれてありがとう!私はこの質問に別の数日を与えるつもりです。私はあなたの答えを優先回答として選択することを私は疑う。 –

+0

お返事ありがとうございます。とても役に立ちました! –

関連する問題