Composerについて（概要からインストール方法まで）

# Composerとは
PHP向けのソフトウェアパッケージ・ライブラリの依存関係を管理する、パッケージ管理システム

## そもそもパッケージて何
システム開発を行う際に、便利な仕組みや関数をまとめたもの
標準のphpのみでの開発は難しいので、大体パッケージを利用しているのが常

もしパッケージがなければ、ここに書かれている内容を全て開発者自身がコードを書かなければいけないので、
私たちは常にパッケージの恩赦を受けながら開発している(と思う）

Composerはこのようなパッケージを管理するためのツール

## Composerのメリットて何

##### ・使用しているパッケージをファイルで管理できる
「パッケージ管理」なので、上記で説明したパッケージをファイルで管理できる
パッケージを取得したあとに、パッケージにバグや脆弱性が発覚し作成者がパッケージを更新することがある

手動でダウンロードしてきたパッケージだと、定期的にアップデート情報を確認して、
再ダウンロードするという作業が必要になるが、Composerで取得したものであるなら、updateコマンドを実行するだけで、
使用しているすべてのパッケージの更新を確認し、更新がある場合は再取得してソースコードを最新の状態に保ってくれる

また、プロジェクトに必要なパッケージと参照しているURLがファイルがcomposer.lockというファイルに記録されるので、
このファイルをGit管理などして、チーム内で共有すれば、
ローカルの環境をチーム内で統一しやすくなるという利点もある

##### ・パッケージの依存関係を解消してくれる
そもそも依存管理システムとは、
そのPHPプロジェクトで必要なパッケージは何かを列挙すると、それらを自動的にインストールしてくれるものである

例えば、Aというパッケージが必要なとき、Bというライブラリが必要だという事例が多々存在する。
手作業でそれらのライブラリを収集する場合は、特に手間と時間がかかる。
Composerでは利用するパッケージとしてAを記述すれば、自動的にBも含めてインストールしてくれるという感じ

##### ・オートローダーが存在する
→オートロードとは
　文字通り自動でロードする仕組み
　PHPでは``require_once``などの記述によって、使用したいファイルを明示的にする必要があるが、
　これを自動的に読み込んでくれる仕組み


Composerでは、PHPのオートローダーが内蔵されており、Composerで取得したファイルだけでなく、
パッケージ管理外のファイルも対象に含んでくれる
このオートロード機能だけを使用するといったことも可能

## Composerにおいての重要なファイル
#### composer.json
Composerの設定を記述する為のファイル
Composerをインストールして、``composer install``したら、このcomposer.jsonを基に、パッケージなどを
venderディレクトリ配下にまとめてインストールする
```json:package.json
{
    "name": "laravel/laravel",
    "type": "project",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "require": {
        "php": "^7.4|^8.0",
        "aws/aws-sdk-php-laravel": "~3.0",
        "doctrine/inflector": "^1.4",
        "fruitcake/laravel-cors": "^2.0",
        "guzzlehttp/guzzle": "^7.0.1",
        "laravel-doctrine/migrations": "^2.3",
        "laravel-doctrine/orm": "^1.7",
        ...
```

#### composer.lock
``composer install``したときに生成されるのがこのファイル。
``composer insatall``時に参照されたパッケージのバージョン情報や、URLが記載される。
```json:composer.lock
"packages": [
        {
            "name": "asm89/stack-cors",
            "version": "v2.0.3",
            "source": {
                "type": "git",
                "url": "https://github.com/asm89/stack-cors.git",
                "reference": "9cb795bf30988e8c96dd3c40623c48a877bc6714"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/asm89/stack-cors/zipball/9cb795bf30988e8c96dd3c40623c48a877bc6714",
                "reference": "9cb795bf30988e8c96dd3c40623c48a877bc6714",
                "shasum": ""
            },
            "require": {
                "php": "^7.0|^8.0",
                "symfony/http-foundation": "~2.7|~3.0|~4.0|~5.0",
                "symfony/http-kernel": "~2.7|~3.0|~4.0|~5.0"
            },
            "require-dev": {
                "phpunit/phpunit": "^6|^7|^8|^9",
                "squizlabs/php_codesniffer": "^3.5"
            },
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-master": "2.0-dev"
                }
            },
```
2回目以降に``composer install``した際は、このcomposer.lockが参照される
ディレクトリ内にcomposer.lockがある場合、``composer install``しても、単にcomposer.lockを参照してライブラリをインストールするので、何かが書き換わることはない。（アップデートしたいときは``composer update``）

なので、前述したように、このファイルをチーム内で共有し、ローカルに落として``composer install``するだけで、
チームでバージョン等を統一した状態で開発に必要なパッケージをインストールする事が可能

まとめると
|コマンド|composer.lock|動作
|:---|:---|:---|
|composer install|あり|composer.lockを元にインストール
|composer install|なし|composer.jsonを元にインストール・composer.lock生成
|composer update|あり|composer.jsonを元にアップデート・composer.lock更新
|composer update|なし|composer.jsonを元にアップデート・composer.lock生成

## インストール方法
### windows
Composerのダウンロードページから``Composer-Setup.exe``をダウンロードし、ファイルを実行する
その際に、PHPのパスを指定する必要がある
![スクリーンショット 2022-09-01 100048.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626031/e28dcfb8-6868-03cf-10ec-c7e923301fa2.png)

また、コマンドラインで直接インストールすることも可能

XAMPPでインストールしたディレクトリにインストールする場合は、
``cd c:\xampp\php``でPHPがインストールされている場所に移動し、
``php -r "readfile('https://getcomposer.org/installer');" | php``で直接composerのファイルを配置
``echo @php "%~dp0composer.phar" %*>composer.bat``でバッチファイル（複数のコマンド列をあらかじめ記述してあるファイル、ここではComposerの機能を実現させる為のコマンド列）を作成することでインストールが完了する
```
 cd c:\xampp\php
> php -r "readfile('https://getcomposer.org/installer');" | php
> echo @php "%~dp0composer.phar" %*>composer.bat
```

### Linux／Mac
コンソール上でインストールすることが可能
``curl -sS https://getcomposer.org/installer | php``でComposer本体をダウンロード
``sudo -s mv composer.phar /usr/local/bin/composer``でcomposerコマンドを使用することができるように、ダウンロードしたファイルを/user/local/binなどのサーチパス（コマンドを実行する際に参照するディレクトリ）が通った場所に配置する

```
$ curl -sS https://getcomposer.org/installer | php
#!/usr/bin/env php
All settings correct for using Composer
Downloading...

Composer successfully installed to: /Users/phpuser/tmp/composer.phar
Use it: php composer.phar
$ sudo -s mv composer.phar /usr/local/bin/composer
```

## まとめ

Composerってありがたい
（何か間違えあれば指摘お願い致します)