30389
**GitHub掲載コードで、「Composerコマンドでインストールして使用する場合」と「GitHubからzipでダウンロード後、アップロードして使用する場合」では何が違うのでしょうか？**  
・例えば、TwitterOAuth  
・何れも、autoload.phpを読み込んだ後、useを使用すると思うのですが

* * *

**autoload.php内容も、ディレクトリ構成も異なっています**  
・やっていることは同じ？  
・「Composer」は、vendor以下に格納する、というルールがあるだけ？  
・GitHubからzipでダウンロード後した内容にも「composer.json」が含まれているのはなぜでしょうか？

* * *

**最終的に知りたいこと.**  
・ダウンロードした場合と、Composerコマンドでインストールした場合とで、「autoload.php」「composer.json」内容が異なる理由は？  
・Composer「使用する場合」と「使用しない場合」とで、それぞれのメリットデメリットを教えてください
CC BY-SA 3.0
2016-11-14T00:26:31.673
30384
2016-11-15T11:54:30.613
7886
question
php composer
GitHub掲載コードで、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](https://github.com/abraham/twitteroauth/blob/master/composer.json)
です。もし TwitterOAuth がさらに別のパッケージに依存していれば、そのことが記載されるのもここです。

ところで、このHogeAppもComposerから見ればパッケージの一種で、「HogeAppにTwitterOAuthをインストールする」というのはつまり「HogeAppがTwitterOAuthに依存する」ことです。そのためHogeAppにもcomposer.json
(1) が作成され、TwitterOAuthに依存するという記述が行われます。

> GitHubからzipでダウンロード後した内容にも「composer.json」が含まれているのはなぜでしょうか？

[Releasesページ](https://github.com/abraham/twitteroauth/releases)の「Source code
(zip)」リンク等からダウンロードするファイルは作者が用意したものではなく、 **リポジトリ丸ごと**
ダウンロードするというGithubの機能です。なのでリポジトリ上の composer.json がそのまま含まれている、というだけです。

ちなみにComposerを使ってインストールした場合は、リポジトリ上の autoload.php
は使われません。好きなインストール方法を選んだら、その方法で使わないファイルは無視すればよいです。

### vendor/autoload.php とパッケージに同梱された autoload.php

完全修飾名やuseによってクラスを指定すれば自動的にファイルを読み込んでくれるというのはPHPの[オートローディング](http://php.net/manual/ja/language.oop5.autoload.php)という機能ですが、この機能を使うためにはオートローダーという「クラス名を渡すとそれが含まれるファイルパスを返す関数」を用意しなければなりません。

  * Composerでインストールしたパッケージを対象に **Composer が自動生成した** オートローダーが vendor/autoload.php (2) です。

  * TwitterOAuthだけを対象に **TwitterOAuthの作者が書いた** オートローダーが、[リポジトリ上の autoload.php](https://github.com/abraham/twitteroauth/blob/master/autoload.php) です。

オートローダの登録は [`spl_autoload_register()`](http://php.net/manual/ja/function.spl-
autoload-register.php)
という関数を呼び出すだけなので、ファイル名に規定はありませんが、TwitterOAuthの場合は[Composerと同じファイル名にした](https://github.com/abraham/twitteroauth/commit/96251143da6a38a546963a3a67d1cade416a41e8)ということのようです。

### Composerを使う利点

今回の質問と回答で触れた範囲で言えば、

  * `autoload.php` が付属するライブラリを複数利用する場合、それぞれの `autoload.php` を個別に require しなければならないが、Composerを使えば `vendor/autoload.php` ひとつで済む

といったあたりでしょうか。

Composerの本命は依存性の解決なのですから、同じライブラリがComposer版とzip版の両方で提供されているなら、利用者側で変化するのはライブラリのインストール・管理の方法ぐらいです。
CC BY-SA 3.0
2016-11-14T06:36:54.620
30389
2016-11-15T11:54:30.613
2016-11-15T11:54:30.613
8000
8000
30384
answer