[Laravel] composer installで実行されること

ほぼ脳死で実行していたcomposer installにおいて、どのような処理が実行されているかをまとめました。主に備忘用なので、結構雑です。

# 環境

- PHP バージョン: 8.2
- Laravel Framework: 10

# composer.json

```
{
    "name": "laravel/laravel",
    "type": "project",
    "description": "The skeleton application for the Laravel framework.",
    "keywords": [
        "laravel",
        "framework"
    ],
    "license": "MIT",
    "require": {
        "php": "^8.1",
        "aws/aws-sdk-php": "^3.280",
        "guzzlehttp/guzzle": "^7.2",
        "laravel/framework": "^10.10",
        "laravel/tinker": "^2.8",
        "onelogin/php-saml": "^4.1",
        "owen-it/laravel-auditing": "^13.5",
        "league/flysystem-aws-s3-v3": "^3.0"
    },
    "require-dev": {
        "barryvdh/laravel-debugbar": "^3.9",
        "fakerphp/faker": "^1.9.1",
        "laravel/pint": "^1.0",
        "laravel/sail": "^1.18",
        "mockery/mockery": "^1.4.4",
        "nunomaduro/collision": "^7.0",
        "nunomaduro/larastan": "^2.6",
        "phpunit/phpunit": "^10.1",
        "spatie/laravel-ignition": "^2.0"
    },
    "autoload": {
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
    "scripts": {
        "post-autoload-dump": [
            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
            "@php artisan package:discover --ansi"
        ],
        "post-update-cmd": [
            "@php artisan vendor:publish --tag=laravel-assets --ansi --force"
        ],
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "@php artisan key:generate --ansi"
        ]
    },
    "extra": {
        "laravel": {
            "dont-discover": []
        }
    },
    "config": {
        "optimize-autoloader": true,
        "preferred-install": "dist",
        "sort-packages": true,
        "allow-plugins": {
            "pestphp/pest-plugin": true,
            "php-http/discovery": true
        }
    },
    "minimum-stability": "stable",
    "prefer-stable": true
}
```


# 実行内容

composer installでは以下が実行される。


## 1. **パッケージのインストール**

- `require`セクションに記載されているパッケージのインストールが実行される
- `require-dev`セクションに記載されているパッケージのインストールが実行される
    - --no-devオプションを付けた場合、このrequire-devセクションのパッケージはインストールされない)

## 2. **オートローダーの生成**:

- `autoload`セクションの設定に基づいてオートローダー(PSR-4準拠)が生成されて、名前空間のマッピングが行われる
    - 例: App\名前空間をapp/ディレクトリにマッピング
- `autoload-dev`セクションの名前空間のマッピングは--no-devオプションをつけた場合は実行されない

### オートローダーとは

PHPでクラスやインターフェースを使用する際に、それらのファイルを自動的に読み込む（require/include）仕組み。

[参考](https://zenn.dev/aki_artisan/articles/php-autoloading)

## 3. **スクリプトの実行** 

※ --no-scripts`オプションを付けない場合は実行されない。

`scripts`セクションには、composerコマンド実行時に特定のイベントが発生した際に実行されるコマンドを定義する。

composer install時に実行されるのはpost-autoload-dumpのみ。

### **post-autoload-dump:** 

 `composer install` または `composer update` コマンド実行後、オートローダーが生成された後に実行される。

#### Illuminate\\Foundation\\ComposerScripts::postAutoloadDump

`Illuminate\\Foundation\\ComposerScripts::postAutoloadDump` は、Laravel アプリケーションを正しく動作させるために必要な処理を行う重要なスクリプトです。 

- **キャッシュのクリア:** Laravel アプリケーションの動作を高速化するために、設定、ルート、ビューなどのファイルをキャッシュしている。このスクリプトは、これらのキャッシュをクリアして、最新のコードが反映されるようにする。
- **最適化ファイルの生成:**  アプリケーションの起動時間を短縮するために、いくつかのファイルを結合して最適化する。
- **その他の処理:**  イベントリスナーの登録や、サービスプロバイダの読み込みなど、Laravel アプリケーションの初期化に必要な処理を行う。

https://laravel.com/api/10.x/Illuminate/Foundation/ComposerScripts.html#method_postAutoloadDump

#### @php artisan package:discover --ansi

- Laravelのパッケージ自動検出システムを実行し、インストールされているパッケージのサービスプロバイダーや他の設定を自動的に見つけて登録する(=インストールされたパッケージを Laravel に認識させる)
- 具体的に行っていること
    - このサービスプロバイダーを自動的に検出
    - Laravelのサービスコンテナに登録
    - ファサードを利用可能にする

### **post-update-cmd:** 

`composer update` コマンド実行後に実行される。

#### @php artisan vendor:publish --tag=laravel-assets --ansi --force

`laravel-assets` タグが付いたパッケージのリソースをパブリッシュする。

### **post-root-package-install:** 

ルートパッケージ(ここではlaravel/laravel)がインストールされた後に実行される

#### @php -r "file_exists('.env') || copy('.env.example', '.env');"

`.env` ファイルが存在しない場合、`.env.example` ファイルを `.env` ファイルとしてコピーする。

### **post-create-project-cmd:** 

 `composer create-project` コマンド実行後、新しい Laravel プロジェクトが作成された後に実行される

 
#### `@php artisan key:generate --ansi`

アプリケーションの暗号化キーを生成する。