.NET 5 から .NET 6 に移行してみた

11月8日にVisual Studio 2022とともに、.NET 6がリリースされました。.NET 6はLTS(長期サポート)となっており、.NET 5は2022年2月ごろにサポートが終了する予定です。当社でも.NET 5で作成されたプロジェクトがあり、順次.NET 6に移行中です。ある程度移行手順が固まったためまとめておきます。

ターゲットフレームワークの設定

まずはこれでしょう。*.csproj ファイルにターゲットフレームワークを指定するところがあります。

<TargetFramework>net5.0</TargetFramework>

以下のように一括置換します。

<TargetFramework>net6.0</TargetFramework>

※ソリューションに多くのプロジェクトが存在することが多いため一括置換しています。単一プロジェクトのときは、プロジェクトのプロパティから変更したほうがいいかもしれません。

NuGetパッケージの更新

参照するパッケージを一括で更新します。
ソリューションエクスプローラーでソリューションを右クリック > [ソリューションのNuGetパッケージの管理] を選択し、[更新プログラム] に新しいパッケージがあった場合は全て更新します。

Entity Framework Core ツールの更新

はじめて.NET 6に移行する場合はEntity Framework Core ツールを更新します。すでに更新している場合は不要です。

dotnet tool update --global dotnet-ef

DBからEntityを再作成

DBファーストのプロジェクトの場合、scaffoldでEntityを再作成します。

dotnet ef dbcontext scaffold <必要なオプション>

Dockerfileの更新

Dockerを使用しているプロジェクトの場合、Dockerfileを更新します。

mcr.microsoft.com/dotnet/aspnet:5.0
mcr.microsoft.com/dotnet/sdk:5.0

下のように一括置換します。

mcr.microsoft.com/dotnet/aspnet:6.0
mcr.microsoft.com/dotnet/sdk:6.0

ファイルスコープ名前空間を使用

どうせなので更新しておきます。たかが1ネストですが、だいぶスッキリします。
ソリューションの .editorconfig に以下を追記します。

[*.{cs,vb}]
csharp_style_namespace_declarations=file_scoped:suggestion

Visual Studio の一括置換機能で[ソリューション]を対象にして実行します。すべて自動で更新してくれるので便利です。

ビルドと動作確認とエラー修正

ここまできたらビルドして動作確認します。プロジェクトによってはビルド時、または実行時にエラーが発生することがあります。

当社で発生したエラーの一例をあげておきます。

.editorconfig

これまで .editorconfig を配置していなかった場合、.editorconfig を配置したことによって warning でビルドエラーになることがあります。まあ warning なんて残すなという話ですが。scaffold でDbContextを再作成した場合、コンストラクタに #warning が埋め込まれるため、そのままビルドするとビルドエラーになります。

Npgsql.EntityFrameworkCore.PostgreSQL

これまで接続文字列でSslMode=Requireを指定していましたが、実行時にエラーを吐くようになりました。SslMode=VerifyFullに変更しました。
※環境によって適切なものを選択してください。

appsettings.json

1つのソリューションで複数のWeb APIプロジェクトがあり、各プロジェクトに appsettings.json が配置されていました。このようなプロジェクトをビルドしたとき、出力される appsettings.json が競合しているというエラーを吐くようになりました。appsettings.json と appsettings.Development.json をSolution Items に配置し、各プロジェクトではリンクとして参照することにより正常にビルドできるようになりました。

ただし、この方法だとローカルで実行したときに appsettings.json が読み込めない問題が発生しました。リンクではなくビルド構成で除外するべきなのでしょうか。その方がDockerイメージが小さくなるためそうするべきなのかもしれませんが、プロジェクトが大量にあると発行が手間になるので悩ましいところです。解決方法があったら教えてください。

発行とデプロイ

Azure Container Registry に発行、Azure Kubernetes Service (AKS) にデプロイして動作を確認します。
※実行環境にあわせてください。

まとめ

プロジェクトによってたまにエラーが出るものの、簡単に移行できることがわかりました。冒頭でもあったように.NET 6 はLTSですし、パフォーマンスも向上しています。移行しない理由はないため、どんどん(自己責任で)移行していきましょう。

2 COMMENTS

h.s

> 1つのソリューションで複数のWeb APIプロジェクトがあり、各プロジェクトに appsettings.json が配置されていました。このようなプロジェクトをビルドしたとき、出力される appsettings.json が競合しているというエラーを吐くようになりました。

現在でも発生する仕様です。
どちらか、あるいは両方のファイル名を変更すれば解決します。
As-Is
pj1.appsettings.Development.json
pj2.appsettings.Development.json

To-Be
pj1.appsettings.〇〇.Development.json
pj2.appsettings.△△.Development.json

プロジェクトファイルやAzureの環境設定で、下記の設定もお忘れなく。
As-Is
ASPNETCORE_ENVIRONMENT = Development

To-Be
ASPNETCORE_ENVIRONMENT = 〇〇.Development

返信する
sanada

コメントありがとうございます。
名称変更ですっきり解決できるのですね!今後の参考にさせて頂きます。

返信する

コメントを残す

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

CAPTCHA