Laravelのバージョンの指定方法
2020-03にLaravel 7がリリースされた。これにより,laravel/installerでLaravelのプロジェクトを作成するとLaravel 7が使われる。ただし,Laravel 7はLTSではないため,中長期的な使用には向いていない。そのため,直前のLTSの6を明示的に指定する必要が出てきた。
そこでLaravelのバージョンの指定方法を整理する。
新規プロジェクトの変更
laravel/installerではLaravel 5.2の頃まではオプションでバージョン指定に対応しており,以下のようなコマンドでバージョンを指定できていた。
laravel new --5.1 blog
ただし,2020-02-15の5.2の途中からオプションが削除されてしまい,この方法でバージョンを指定できなくなった。
代わりに,composer
の以下のコマンドでプロジェクトを作成すればいい (参考: Install specific version using laravel installer – Stack Overflow)。
composer create-project laravel/laravel:^6.0 .
既存プロジェクトの変更
プロジェクト作成時であれば上記コマンドで問題ない。問題なのは既存のプロジェクトのバージョンの変更方法だ。
既存プロジェクトのバージョンの変更方法は「Changing Your Laravel Version – DEV Community ????」が参考になった。
こちらのサイトでは以下の手順でバージョンを変更できると書いてある。
composer
で既存パッケージのバージョンを変更する場合,composer.json
を直接編集する他に,以下のコマンドでも指定したバージョンに変更できる。
composer require foo/bar:1.0.5
これらを元に手順を整理すると以下の手順となる。
まず,vendorディレクトリーは削除しなくても問題なかった。
単に,composer.json
のlaravel/framework
のバージョンを変更して,composer update
を実行すると以下のエラーが出てしまった。
Problem 1
...
- facade/ignition 2.0.1 requires illuminate/support ^7.0 -> satisfiable by laravel/framework[v7.1.0, 7.x-dev], illuminate/support[7.x-dev, v7.0.0, v7.0.1, v7.0.2, v7.0.3, v7.0.4, v7.0.5, v7.0.6, v7.0.7, v7.0.8, v7.1.0, v7.1.1, v7.1.2].
- laravel/ui v2.0.1 requires illuminate/support ^7.0 -> satisfiable by laravel/framework[v7.1.0, 7.x-dev], illuminate/support[7.x-dev, v7.0.0, v7.0.1, v7.0.2, v7.0.3, v7.0.4, v7.0.5, v7.0.6, v7.0.7, v7.0.8, v7.1.0, v7.1.1, v7.1.2].
- nunomaduro/collision v4.1.0 requires symfony/console ^5.0 -> satisfiable by symfony/console[5.0.x-dev, 5.1.x-dev, v5.0.0, v5.0.0-BETA1, v5.0.0-BETA2, v5.0.0-RC1, v5.0.1, v5.0.2, v5.0.3, v5.0.4, v5.0.5].
Laravel 7用にデフォルトで開発用にインストールされているfacade/ignition
とnnomaduro/collision
や,認証機能用に追加したlaravel/ui
がlaravel/framework:7.0
やsymfony/console:5.0
を必要としており,うまくいかなかった。
そこで,まずは以下のコマンドでlaravel/framework
や関連ライブラリーのバージョンを変更して,最後にcomposer update
を実行する。
composer require --no-update laravel/framework:^6.0
composer require --no-update --dev facade/ignition:^1.0 laravel/ui:^1.0 nunomaduro/collision:^3.0
composer update
composer require
コマンドはcomposer.json
のバージョンの変更にも使える。ただし,そのままだとコマンド実行時にcomposer update
相当の処理も行ってしまう。require-dev
セクションのパッケージのバージョンを変更してからcomposer update
を実行したいので,--no-update
オプションでcomposer.json
の編集のみを行う。もちろん手動でcomposer.json
の該当リポジトリーのバージョンを変更しても問題ない。
これによりパッケージの更新が完了し,composer.lock
も更新された。ただし,何やら以下のエラーが出てしまっている。
Fatal error: Declaration of App\Exceptions\Handler::report(Throwable $exception) must be compatible with Illuminate\Foundation\Exceptions\Handler::report(Exception $e) in /home/senooken/project/product/test2/app/Exceptions/Handler.php on line 8 Call Stack: 0.0002 471184 1. {main}() /home/senooken/project/product/test2/artisan:0 0.0518 4167728 2. App\Console\Kernel->handle() /home/senooken/project/product/test2/artisan:37 0.0518 4167728 3. App\Console\Kernel->bootstrap() /home/senooken/project/product/test2/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:129 0.0518 4167728 4. Illuminate\Foundation\Application->bootstrapWith() /home/senooken/project/product/test2/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:320 0.1037 6522464 5. Illuminate\Foundation\Bootstrap\RegisterProviders->bootstrap() /home/senooken/project/product/test2/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:219 0.1037 6522464 6. Illuminate\Foundation\Application->registerConfiguredProviders() /home/senooken/project/product/test2/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/RegisterProviders.php:17 0.1050 6550984 7. Illuminate\Foundation\ProviderRepository->load() /home/senooken/project/product/test2/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:593 0.1375 8501448 8. Illuminate\Foundation\Application->register() /home/senooken/project/product/test2/vendor/laravel/framework/src/Illuminate/Foundation/ProviderRepository.php:75 0.1376 8501560 9. NunoMaduro\Collision\Adapters\Laravel\CollisionServiceProvider->register() /home/senooken/project/product/test2/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:616 0.1378 8504248 10. Illuminate\Foundation\Application->make() /home/senooken/project/product/test2/vendor/nunomaduro/collision/src/Adapters/Laravel/CollisionServiceProvider.php:44 0.1378 8504248 11. Illuminate\Foundation\Application->make() /home/senooken/project/product/test2/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:770 0.1378 8504248 12. Illuminate\Foundation\Application->resolve() /home/senooken/project/product/test2/vendor/laravel/framework/src/Illuminate/Container/Container.php:629 0.1378 8504248 13. Illuminate\Foundation\Application->resolve() /home/senooken/project/product/test2/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:785 0.1378 8504248 14. Illuminate\Foundation\Application->build() /home/senooken/project/product/test2/vendor/laravel/framework/src/Illuminate/Container/Container.php:681 0.1378 8504248 15. Illuminate\Foundation\Application->Illuminate\Container\{closure:/home/senooken/project/product/test2/vendor/laravel/framework/src/Illuminate/Container/Container.php:259-267}() /home/senooken/project/product/test2/vendor/laravel/framework/src/Illuminate/Container/Container.php:799 0.1378 8504248 16. Illuminate\Foundation\Application->resolve() /home/senooken/project/product/test2/vendor/laravel/framework/src/Illuminate/Container/Container.php:265 0.1379 8504248 17. Illuminate\Foundation\Application->resolve() /home/senooken/project/product/test2/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:785 0.1379 8504248 18. Illuminate\Foundation\Application->build() /home/senooken/project/product/test2/vendor/laravel/framework/src/Illuminate/Container/Container.php:681 0.1379 8504408 19. ReflectionClass->__construct() /home/senooken/project/product/test2/vendor/laravel/framework/src/Illuminate/Container/Container.php:803 0.1379 8504488 20. spl_autoload_call() /home/senooken/project/product/test2/vendor/laravel/framework/src/Illuminate/Container/Container.php:803 0.1379 8504568 21. Composer\Autoload\ClassLoader->loadClass() /home/senooken/project/product/test2/vendor/laravel/framework/src/Illuminate/Container/Container.php:803 0.1379 8504568 22. Composer\Autoload\includeFile() /home/senooken/project/product/test2/vendor/composer/ClassLoader.php:322 0.1381 8510040 23. include('/home/senooken/project/product/test2/app/Exceptions/Handler.php') /home/senooken/project/product/test2/vendor/composer/ClassLoader.php:444
このエラーについて調べると「Issue #31686 · laravel/framework」を見つけた。どうやら,「Upgrade Guide」があるので,これに合う形でベースのソースコードの修正も必要なようだ。
ベースのソースコードの修正は少々難易度が高いので,ここで既存プロジェクトのバージョンの変更を諦めた。
結論
Laravelのバージョンの指定方法を整理した。
結局新規プロジェクトの作成時に以下のcomposer
のコマンドで指定するのが無難なようだ。
composer create-project laravel/laravel:^6.0 .
既存プロジェクトのバージョンの変更は少々難易度が高いため断念してしまった。
フレームワークは型通りの作業であれば効率が良いのだが,今回のように少しでもイレギュラーなことをしようとすると急に難易度が高くなる。
どのみち将来バージョンを上げる作業も発生するのだが,ひとまず後に回して目の前の勉強に取り組みたい。