ほぼ脳死で実行していた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)仕組み。
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 アプリケーションの初期化に必要な処理を行う。
@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
アプリケーションの暗号化キーを生成する。