【Laravel】6.x〜7.6.2にバージョンをあげたお話

どーも!

たかぽんです!

ついこないだ手元の遊び用プロジェクトをlaravel5~6.15.5にあげたのですが...

laravel更新が早いですね・・・w

すでに7.6が最新(2020/04/18)になっています。

というわけで、Laravelを最新にやっていこうと思います。

今回行うプロジェクトはほとんど初期状態のプロジェクトなので、実際のサービスで様々な従来のメソッド等を使っていらっしゃる方にとってはあまりご参考にならないかもしれません...

Laravelをアップグレードする方法って?

まずは基本的にアップグレードする際に行わないといけないことを解説しておきます。

まず、Laravelはcomposerというパッケージ管理ツールを使用してインストールしたと思います。

そのcomposerのどのパッケージを取得するかの設定で、"laravelのこのバージョン使います"といった設定があるので、そこを修正します。

そして、書き換えたらその設定に合わせてパッケージを取得・削除する必要があります。

その際、大抵様々なエラーメッセージがでてくるので、それを出てこなくなるまで修正できればOKです。

簡単にまとめておきます。

  • composer.json(composerのパッケージ用ファイル)を修正
  • composer updateで設定したパッケージを取得・削除
  • エラーが出たら修正

上記が大まかな手順です!

では、実際にやるのと合わせてやってみます!

composer.jsonを更新する

では早速ですが、Laravelのバージョンを更新していきます。

プロジェクトフォルダ下にcomposer.jsonがあるので、その中の"laravel/framework"を以下のように修正します。

  "laravel/framework": "^7.0",

これで、laravelの7系の最新のバージョンを取ってきて〜という意味になります。

現在はLaravel7.6.2が最新なので、v7.6.2が指定されます。

基本的にlaravelのバージョンをあげるだけなら以上で大丈夫です。

では、一度動かしてみましょう!

パッケージを取得・削除

先ほどcomposer.jsonファイルにて指定したlaravelを取得するため以下のコマンドを打ちます。

composer update

すると...

Script @php artisan package:discover handling the post-autoload-dump event returned with error code 255

ほうほう・・・。

いまいちわからん...

から調べてみると・・・?

大抵の日本語サイトでは"bootstrap/cash"辺りのファイルを削除するように!

とあったので、削除しても治らず...

そして別のコメントをみてみるとドストライクにありましたね!

6系から7系へ移行する場合は上記に従って一部修正する必要があるようでした。

やっていきましょう。

まずはExceptions/Handler.phpです。

書いてある通りではありますが、ExceptionをThrowableに修正します。

// use Exception;
use Throwable;

class Handler extends ExceptionHandler
{
  ...
  // public function report(Exception $exception)
  public function report(Throwable $exception)
  {
    parent::report($exception);
  }
  // public function render($request, Exception $exception)
  public function render($request, Throwable $exception)
  {
    return parent::render($request, $exception);
  }
}

筆者の場合メソッドは上記二つでしたが、他にもrenderforconsoleメソッドやshouldreportメソッドがあればそちらも同じく修正するひつようがあるそうです。

この修正を終えたら今度はsession.phpを修正します。

    |--------------------------------------------------------------------------
    | HTTPS Only Cookies
    |--------------------------------------------------------------------------
    |
    | By setting this option to true, session cookies will only be sent back
    | to the server if the browser has a HTTPS connection. This will keep
    | the cookie from being sent to you if it can not be done securely.
    |
    */

  // 'secure' => env('SESSION_SECURE_COOKIE', false),
   'secure' => env('SESSION_SECURE_COOKIE', null),

envメソッドの呼び出し時の第二引数が"null"に変わりました。

これで、updateを再度実行してみましょう!

すると...?

    - laravel/framework 7.x-dev requires symfony/console ^5.0 -> satisfiable by symfony/console[v5.0.7, 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, v5.0.6].
    - Conclusion: don't install symfony/console 5.1.x-dev

laravel/frameworkの7系ではsymfony/consoleの5.0以上が必要なんですが...

インストールできませんでした...

ぐぬぬ・・・もうちょっと詳細をみたいので、今度はログの詳細をだすようにして実行します。

composer update -vvv

すると・・・?


Takapon:MyProject taka$ composer update -vvv
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Conclusion: don't install laravel/framework v7.6.2
    ...
    ...
    - Installation request for nunomaduro/collision ^3.0 -> satisfiable by nunomaduro/collision[v3.0.0, v3.0.1].
    - nunomaduro/collision v3.0.0 requires symfony/console ~2.8|~3.3|~4.0 -> satisfiable by symfony/console[

どうやら"nunomaduro/collision"というパッケージ周りで問題がありそうですね。

nunomaduro/collision v3.0.0 requires symfony/console ~2.8|~3.3|~4.0

なので、このパッケージnunomaduro/collisionのv3.0.0を使うためにはsymfony/consoleの4系以下が必要みたいです。

そして今回...laravel6系から7へ移行したことで、このsymfony/consoleも最新バージョンの5に変わってしまいました。つまり...

laravel本体に必要なsymfony/consoleが新しくなり、開発用で使っていたnunomaduro/collisionはそのsynfony/consoleの古いバージョンが必要だった。

ということのようです。

以下から確認ができます。

6.18.8ではsymfony/consoleが^4.3.4に、7では^5.0になっていますね。

symfony/consoleが新しくなっているのがわかります。

で、composer.jsonでは僕の場合、以下のようになっていました。

    "require-dev": {
        "beyondcode/laravel-dump-server": "^1.0",
        "filp/whoops": "^2.0",
        "fzaninotto/faker": "^1.4",
        "mockery/mockery": "^1.0",
        "nunomaduro/collision": "^3.0", // <-ココで該当の3系をインストールするような指示をしてる
        "phpunit/phpunit": "^7.5"
    },

つまり・・・。

package.jsonで指定しているnunomaduro/collisionの3系をインストールしようとするけど...

symphony/consoleの4系が必要なため、今回のようにエラーになってしまっている・・・。

ということのようです。

念のため、nunomaduro/collisionに必要なパッケージもみておきましょうか。

requireにsymphony/console~2.8|~3.3|~4.0が必要であると書いてありますね...

原因はわかりました。

そこで考えられる対応策としては以下二つ

  • いい感じに対応したnunomaduro/collisionパッケージを探す
  • nunomaduro/collisionを削除する

さて、今回は幸いrequire-devという、開発環境でのみ使用するパッケージでエラーになりました。

このnunomaduro/collisionはコンソールでエラーをみやすくしてくれるやつらしいです。

laravelを使っていたらよくみるconsoleに色がついてるあれらしい・・・!(伝われ!

というわけで、先ほどのGitのリポジトリをちょっとみてみると、laravel7に対応しているようです。

おや?さっきはできませんでしたね・・・。

念のため最新版のnunomaduro/collisionに必要なペッケージ群を確認してみましょう。

お、最新バージョンは4.2.0で、最新の物ならsymphony/console^5.0、つまり5.0以上に対応しているようです。

僕がもともとcomposer.jsonで使用していたものは3.0で4以下にしか対応していなかったので、これを新しくしてあげれば良さそうです...!

では、このnunomaduro/collisionの最新版を使うようにしましょう。

以下のコマンドで、composer.jsonのrequire-devに最新版(今回はv4.2.0)が追加されればOKです。

composer require nunomaduro/collision --dev

筆者はログの詳細がみたかったので-vvvオプションを付与して実行してみました。

すると...

Takapon:MyProject taka$ composer require nunomaduro/collision --dev -vvv
Reading ./composer.json
Loading config file ./composer.json
Checked CA file /private/etc/ssl/cert.pem: valid
...
...
Discovered Package: nunomaduro/collision
Package manifest generated successfully.

いい感じっぽい。

composer.jsonもみておきましょう。

    "require-dev": {
        "beyondcode/laravel-dump-server": "^1.0",
        "filp/whoops": "^2.0",
        "fzaninotto/faker": "^1.4",
        "mockery/mockery": "^1.0",
        "nunomaduro/collision": "^4.2",
        "phpunit/phpunit": "^7.5"
    },

nunomaduro/collisionが最新の4.2以上になっていますね!

やっとこさ準備ができました!

ではまた改めてupdateしてみます。

Takapon:MyProject taka$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 4 installs, 15 updates, 5 removals
  - Removing symfony/debug (v4.4.7)
  - Removing paragonie/random_compat (v9.99.99)
  - Removing jakub-onderka/php-console-highlighter (v0.4)
  - Removing jakub-onderka/php-console-color (v0.2)
  - Removing nunomaduro/collision (v3.0.1)
  - Updating symfony/var-dumper (v4.4.7 => v5.0.7): Downloading (100%)
  - Updating symfony/http-foundation (v4.4.7 => v5.0.7): Downloading (100%)
  - Updating symfony/translation (v4.4.7 => v5.0.7): Downloading (100%)
  - Installing voku/portable-ascii (1.4.10): Downloading (100%)
  - Updating vlucas/phpdotenv (v3.6.3 => v4.1.4): Downloading (100%)
  - Updating symfony/routing (v4.4.7 => v5.0.7): Downloading (100%)
  - Updating symfony/process (v4.4.7 => v5.0.7): Downloading (100%)
  - Installing psr/event-dispatcher (1.0.0): Downloading (100%)
  - Updating symfony/event-dispatcher-contracts (v1.1.7 => v2.0.1): Downloading (100%)
  - Updating symfony/event-dispatcher (v4.4.7 => v5.0.7): Downloading (100%)
  - Updating symfony/error-handler (v4.4.7 => v5.0.7): Downloading (100%)
  - Updating symfony/http-kernel (v4.4.7 => v5.0.7): Downloading (100%)
  - Updating symfony/finder (v4.4.7 => v5.0.7): Downloading (100%)
  - Updating symfony/console (v4.4.7 => v5.0.7): Downloading (100%)
  - Installing ramsey/collection (1.0.1): Downloading (100%)
  - Installing brick/math (0.8.15): Downloading (100%)
  - Updating ramsey/uuid (3.9.3 => 4.0.1): Downloading (100%)
  - Updating laravel/framework (v6.18.8 => v7.6.2): Downloading (100%)
  - Updating beyondcode/laravel-dump-server (1.3.0 => 1.4.0): Downloading (100%)
voku/portable-ascii suggests installing ext-intl (Use Intl for transliterator_transliterate() support)
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Script @php artisan package:discover --ansi handling the post-autoload-dump event returned with error code 255

お、良さそう・・・!

と思ったんですが、最後の一行...なんだこれ・・・。

また最初のやつがでてきたな・・・?

と...

laravel自体はうまくインストールできていそうなのに...

結論をさくっと言ってしまうと、僕の場合前の対策時に間違ってbootstrap/cacheフォルダを削除していたようです。

この状態だと、php artisan自体使えなくなっていました。

原因もわかったので作り直して再度トライしたら...

Takapon:MyProject taka$ mkdir bootstrap/cache/
Takapon:MyProject taka$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: beyondcode/laravel-dump-server
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Package manifest generated successfully.
Takapon:MyProject taka$ php artisan
Laravel Framework 7.6.2

うまくいきました!

laravel自体はダウンロードされていたのでログはほとんどないですが、最後にphp artisanコマンドでちゃんと7.6.2の最新になっていました!

まとめ

結構長くなってしまいましたね・・・。

ただ、このアップデートに関しては入れている物によって大文エラー内容が変わってくるはずです。

大抵laravel7へ移行する際のアップグレードガイドで解決できると思いますが、一部は探さないと書かれていないこともあるので、都度都度探してしらべてみるしかなさそうですね・・・。

今回も比較的単純な構成のプロジェクトだったはずが、半日近くかかりましたからね...w

次回はある程度慣れてきたのでもう半分くらいにできるかもだけど...

おおまかな流れは似たような感じになってくるのかな?と思いますので、是非ご参考にしてみてください。

おすすめの記事