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 👩‍💻👨‍💻」が参考になった。

こちらのサイトでは以下の手順でバージョンを変更できると書いてある。

参考サイトのバージョンの変更方法
  1. vendorディレクトリーを削除
  2. composer.json"laravel/framework"のバージョンを変更
  3. composer installcomposer updateを実行

composerで既存パッケージのバージョンを変更する場合,composer.jsonを直接編集する他に,以下のコマンドでも指定したバージョンに変更できる。

composer require foo/bar:1.0.5
参考

これらを元に手順を整理すると以下の手順となる。

既存プロジェクトのLaravelのバージョンの変更方法
  1. composer.jsonlaravel/frameworkのバージョンを変更
  2. composer.jsonの関連開発ライブラリー (facade/ignition, laravel/ui, nunomaduro/collision) のバージョンを変更
  3. composer updateを実行
  4. その他のコードを修正

まず,vendorディレクトリーは削除しなくても問題なかった。

単に,composer.jsonlaravel/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/ignitionnnomaduro/collisionや,認証機能用に追加したlaravel/uilaravel/framework:7.0symfony/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 .

既存プロジェクトのバージョンの変更は少々難易度が高いため断念してしまった。

フレームワークは型通りの作業であれば効率が良いのだが,今回のように少しでもイレギュラーなことをしようとすると急に難易度が高くなる。

どのみち将来バージョンを上げる作業も発生するのだが,ひとまず後に回して目の前の勉強に取り組みたい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です