【メモ】Composerについて学ぶ(Laravelプロジェクト作成編)

web系のサーバーサイドエンジニアを目指す奴のメモ書きです。


# Composerとは

>Composerは、PHPでの依存関係管理のためのツールです。 プロジェクトが依存するライブラリを宣言することができ、それらを管理（インストール/更新）します。

# 依存関係の管理
YumやAptなどとは異なり、Composerはプロジェクト内のvendorディレクトリなどにパッケージまたはライブラリをインストールする。
つまりプロジェクト単位でパッケージやライブラリのインストールができるということ。

デフォルトとしてプロジェクト単位でインストールする仕様になっているが、globalコマンドを使用すると他のプロジェクトでもインストールしたパッケージやライブラリを参照できるようなる？

Composerを使ってプロジェクトで使いたいライブラリを宣言すると、そのライブラリだけでなく、ライブラリが依存しているライブラリをバージョンの整合性を崩さないようにプロジェクトにインストールすることができる。
依存関係を更新する場合もコマンド一つで実施可能。

# システム要求
2022/4/13現在の最新バージョン(v2.3.4)のComposerを実行するには、PHP7.2.5が必要。
ComposerはマルチプラットフォームでWindows、Linux、macOSで動作する
パッケージをダウンロードする方法としてzipダウンロードか、gitなどのバージョン管理システムのcloneを使う方法がある。
バージョン管理システムのcloneを使う場合は、例えばgitであればgitをインストールしておく必要がある。

# インストール-Windows
Composer-Setup.exe(インストーラー)をダウンロードして実行します。
インストーラーでは毎回最新のComposerバージョンがインストールされ、コマンドラインでどのディレクトリからでもcomposerを呼び出すことができるようにPATHが設定されます。

# Composerチュートリアル

以下のフォルダを作成してLaravelプロジェクトを作成してみる。
`D:\PHP\Trial\FirstLaravelProject`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626978/5ae46de2-c6af-07b8-004d-4bef1d6f4ef1.png)

## Laravelプロジェクトを作成するときのコマンド
```
composer create-project laravel/laravel プロジェクト名 --prefer-dist "バージョン指定"
```

### create-project
create-projectコマンドを使えば既存のパッケージから新しいプロジェクトを作成できる。
中でやっていることは下記と同じこと。
```
git clone https://github.com/laravel/laravel
または
laravel/laravelをzipでダウンロードして解凍
cd laravel
composer install
```
LaravelリポジトリにちゃんとComposer.jsonがあるのでcomposer installができる。
https://github.com/laravel/laravel/blob/9.x/composer.json

### --prefer-dist
>--prefer-source
git cloneでソースを落とす。デフォルト（オプションの指定なし）ではこちらのコマンドが使われる。
--prefer-dist
zipでダウンロードする。このコマンドのほうが高速にソースをダウンロードできるので、このオプションはよく使われる。
https://laraweb.net/surrounding/3973/

本場のgitでもzipダウンロードかcloneか選べる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626978/a3ee331a-8cb1-4af2-4f58-d641b72c651d.png)


### "バージョン指定"
省略すれば最新がダウンロードされる。

## Laravelプロジェクト作成
以下のコマンドを実行してLaravelプロジェクトを作成する。
```
composer create-project laravel/laravel FirstLaravelProject --prefer-dist
```
実行するとバーッと表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626978/84f721bb-4c2a-839b-699a-1d9e01f48e53.png)

完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626978/bdbad4a7-40e1-e445-b966-f53503ac1396.png)


プロジェクト名のフォルダが自動作成されるから無駄に階層が一つ深くなってしまった。
今後はプロジェクトフォルダを作らずにやろうと思う。(プロジェクトをまとめて置くフォルダはあった方がよい)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626978/5a10b3cd-2744-616b-4c46-07cf66f4f679.png)



# Composerの重要だと思われるファイル

### composer.json
>composer.jsonをアプリのディレクトリに配置して`composer install`をしたら、composer.jsonに書かれた情報を基にパッケージやライブラリがvendorディレクトリ配下にまとめてインストールされます。
https://www.engilaboo.com/about-composer/

コマンド実行ディレクトリにcomposer.jsonがないとcomposer installはできない
```
D:\PHP\Trial>composer install
Composer could not find a composer.json file in D:\PHP\Trial
To initialize a project, please create a composer.json file. See https://getcomposer.org/basic-usage
```
0からプロジェクトを作る場合は`composer init`を使って新規プロジェクトを作る。
`composer init`を使う目的は、フレームワークを使わないようなプロジェクトを作ること。
普通に業務をするときにフレームワークを使わないことはないみたいなので、練習用にフレームワークなしでプロジェクト作ってみるとかそのくらいの用途だそう。

### composer.lock
`composer install`で初めてcomposer.jsonの内容でパッケージやライブラリがダウンロードされたときに、自動で作成されるのがcomposer.lock。
ダウンロードしたパッケージやライブラリのバージョン情報がcomposer.lockに書き込まれる。
composer.lockが`composer install`を実行するディレクトリにあるとcomposer.jsonより優先して参照される。
composer.jsonは記載されている情報を使ってパッケージをバージョンの整合性などを判断しながら集めるため時間がかかるケースがある。それに対してcomposer.lockはすでにバージョンの整合性を判断して問題なかったファイルの情報が載っている為、書いてあるものを素直にダウンロードすればよいので処理が速い。
他の人にcomposer.lockを渡せば同じ環境をすぐに作れるので便利だね！


# Composerの学習課題
Composerはまだ知っておいた方がよい情報がありそうだが現時点で使うであろう内容は最低限抑えたのでそのほかはまた別の機会で学ぶ。
・Composerの基本コマンド
・autoload(https://hara-chan.com/it/programming/php-autoload-composer)
・packagist(セントラルリポジトリ)
・composer.jsonの記載内容


参考資料
https://readouble.com/laravel/8.x/ja/installation.html
https://qiita.com/niisan-tokyo/items/8cccec88d45f38171c94
https://ha2pylife.com/laravel-composer/
https://laraweb.net/surrounding/3973/
https://qiita.com/piotzkhider/items/5a6a3d897890dd383f66
https://github.com/laravel/laravel
https://chigusa-web.com/blog/laravel-setup/3/
https://www.engilaboo.com/about-composer/
https://www.webdesignleaves.com/pr/php/php_composer.php
https://qiita.com/shinkuFencer/items/8e109d45861ee56df42a