どーも!
たかぽんです!
ついこないだ手元の遊び用プロジェクトを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
次回はある程度慣れてきたのでもう半分くらいにできるかもだけど...
おおまかな流れは似たような感じになってくるのかな?と思いますので、是非ご参考にしてみてください。