質問: **GitHub掲載コードで、「Composerコマンドでインストールして使用する場合」と「GitHubからzipでダウンロード後、アップロードして使用する場合」では何が違うのでしょうか?** ・例えば、TwitterOAuth ・何れも、autoload.phpを読み込んだ後、useを使用すると思うのですが --- **autoload.php内容も、ディレクトリ構成も異なっています** ・やっていることは同じ? ・「Composer」は、vendor以下に格納する、というルールがあるだけ? ・GitHubからzipでダウンロード後した内容にも「composer.json」が含まれているのはなぜでしょうか? --- **最終的に知りたいこと.** ・ダウンロードした場合と、Composerコマンドでインストールした場合とで、「autoload.php」「composer.json」内容が異なる理由は? ・Composer「使用する場合」と「使用しない場合」とで、それぞれのメリットデメリットを教えてください
回答: ### composer require で生成される composer.json とパッケージの composer.json composer.json はパッケージの名前やバージョン、どんなパッケージに依存しているかというメタ情報を記載するものです。Composerはこれを見て、必要なパッケージをダウンロード・インストールします。 例えば TwitterOAuth に依存した HogeApp を作ることを考えます。`composer require abraham/twitteroauth` を実行すると次のようなファイル構成になるでしょう。 ``` HogeApp/ |-- composer.json (1) |-- vendor/ |-- autoload.php (2) |-- abraham/ |-- twitteroauth/ ``` Composerでインストールできる TwitterOAuth には、そのメタ情報を記述する composer.json が存在します。これがリポジトリ上の composer.json です。もし TwitterOAuth がさらに別のパッケージに依存していれば、そのことが記載されるのもここです。 ところで、このHogeAppもComposerから見ればパッケージの一種で、「HogeAppにTwitterOAuthをインストールする」というのはつまり「HogeAppがTwitterOAuthに依存する」ことです。そのためHogeAppにもcomposer.json (1) が作成され、TwitterOAuthに依存するという記述が行われます。 > > GitHubからzipでダウンロード後した内容にも「composer.json」が含まれているのはなぜでしょうか? > > > Releasesページの「Source code (zip)」リンク等からダウンロードするファイルは作者が用意したものではなく、**リポジトリ丸ごと**ダウンロードするというGithubの機能です。なのでリポジトリ上の composer.json がそのまま含まれている、というだけです。 ちなみにComposerを使ってインストールした場合は、リポジトリ上の autoload.php は使われません。好きなインストール方法を選んだら、その方法で使わないファイルは無視すればよいです。 ### vendor/autoload.php とパッケージに同梱された autoload.php 完全修飾名やuseによってクラスを指定すれば自動的にファイルを読み込んでくれるというのはPHPのオートローディングという機能ですが、この機能を使うためにはオートローダーという「クラス名を渡すとそれが含まれるファイルパスを返す関数」を用意しなければなりません。 * Composerでインストールしたパッケージを対象に**Composer が自動生成した**オートローダーが vendor/autoload.php (2) です。 * TwitterOAuthだけを対象に**TwitterOAuthの作者が書いた**オートローダーが、リポジトリ上の autoload.php です。 オートローダの登録は `spl_autoload_register()` という関数を呼び出すだけなので、ファイル名に規定はありませんが、TwitterOAuthの場合はComposerと同じファイル名にしたということのようです。 ### Composerを使う利点 今回の質問と回答で触れた範囲で言えば、 * `autoload.php` が付属するライブラリを複数利用する場合、それぞれの `autoload.php` を個別に require しなければならないが、Composerを使えば `vendor/autoload.php` ひとつで済む といったあたりでしょうか。 Composerの本命は依存性の解決なのですから、同じライブラリがComposer版とzip版の両方で提供されているなら、利用者側で変化するのはライブラリのインストール・管理の方法ぐらいです。