Amazon Web Services ブログ

Porting Assistant for .NET を発表

.NET Core は .NET の未来です! .NET Framework のバージョン 4.8 はリリースされる最後のメジャーバージョンであり、今後リリースされるのは、バグ、信頼性、およびセキュリティ関連の修正のみであると Microsoft は述べています。.NET プラットフォームへの将来の投資と革新による恩恵を引き続き受けたいアプリケーションについては、アプリケーションを .NET Core に移植することを検討する必要があります。また、Linux とオープンソースの革新から得られるメリット、アプリケーションのスケーリングとパフォーマンスの向上、ライセンス費用の削減など、アプリケーションを .NET Core に移植することを検討する理由は他にもあります。しかしながら、移植にはかなりの人による作業を必要とすることがあり、その中には、プロジェクトの依存関係への参照を更新するなどの付加価値を生まない作業も含まれています。

.NET Framework アプリケーションを移植する場合、デベロッパーは、互換性のある NuGet パッケージを検索し、アプリケーションのプロジェクトファイルでそれらのパッケージ参照を更新する必要があります。これらのパッケージ参照は、.NET Core プロジェクトファイル形式にも更新する必要があります。さらに、.NET Core には .NET Framework で使用可能な API のサブセットが含まれているため、代替の API を見つける必要があります。移植が進むにつれて、デベロッパーは、コンパイルエラーと警告の長いリストを調べて、タスクを一つひとつ処理する上で、対応するのが最適であると思われる領域や、最優先で対応すべき領域を特定する必要があります。言うまでもなく、この作業は大変なもので、手間が増えることにより、アプリケーションのポートフォリオが大きいお客様の活動を妨げることがあります。

本日、当社は、Porting Assistant for .NET を発表しました。これは、お客様が .NET Framework アプリケーションを分析して Linux で実行されている .NET Core に移植するのに役立つ新しいツールです。Porting Assistant for .NET は、アプリケーションのソースコードとパブリック API と NuGet パッケージの依存関係の完全なツリーの両方を評価して、.NET Core と互換性のないものを特定し、互換性のあるものが代わりに利用できる場合にはデベロッパーにその旨を提示します。API とパッケージ置換の提案エンジンは、不足しているパッケージと API の使用パターンと頻度についてアシスタントが学習するにつれて、経時的に改善するように設計されています。

Porting Assistant for .NET は、互換性のない API だけでなく、パッケージの依存関係のツリー全体を評価できるという点で他のツールとは異なります。また、ソリューションファイルを開始点として使用するため、個々のバイナリの情報を分析して集約する必要がなく、多数のプロジェクトを含むモノリシックソリューションを簡単に評価できます。これらの機能やその他の機能により、デベロッパーは移植プロセスをすぐに始めることができます。

アプリケーションの分析と移植
Porting Assistant for .NET を使用したアプリケーションの移植は、いくつかの前提条件を満たすことで簡単に開始することができます。まず、.NET Core 3.1 SDK をインストールする必要があります。次に、認証情報プロファイル (CLI は使用されていないか、必須ではありませんが、AWS Command Line Interface (CLI) と互換性があるもの) が必要となります。認証情報プロファイルは、アプリケーションで使用されるパブリック API およびパッケージ (NuGet およびコア Microsoft パッケージから) と、それが参照するパブリック NuGet パッケージの互換性に関する情報を収集するために使用されます。これらの前提条件を満たしてから、アシスタントのインストーラーをダウンロードして実行します。

アシスタントをインストールしたら、アプリケーションのソースコードをチェックアウトし、Porting Assistant for .NET を [スタート] メニューから起動します。以前にいくつかのソリューションを評価したことがある場合は、[評価済みソリューション] 画面からそれらを表示して開くことができるため、中断したところから再開できます。または、ここで行うように、ホームページから [Get started] を選択して、アプリケーションのソリューションファイルの評価を開始できます。

使用する認証情報プロファイルを選択するように求められます。ここで、テレメトリデータの共有をオプトインすることもできます。このデータを共有すると、時間の経過とともにすべてのユーザーに対する提案の精度がさらに向上し、問題を特定するのに役立ちます。オプトインをぜひご検討ください。

[次へ] をクリックし、必要なソリューションファイルを参照して選択してから、[評価] をクリックして分析を開始します。この投稿では、オープンソースの NopCommerce プロジェクトを使用します。

分析が完了すると、アプリケーションが依存する互換性のないパッケージの数、アプリケーションが使用する互換性のない API、および全体的な移植性スコアといった全体的な結果が表示されます。このスコアは、アプリケーションが使用する互換性のない API の数に基づいて、アプリケーションを .NET Core に移植するために必要な労力の推定です。複数のアプリケーションの移植に取り組んでいる場合、これを使用して、最初に作業を開始するアプリケーションを特定して優先順位を付けることができます。

評価の概要を詳しく見て、何が判明したのかを見てみましょう。ソリューション名をクリックすると、より詳細なダッシュボードが表示され、ソリューションファイルでアプリケーションを構成するプロジェクトを確認できます。また、互換性のないパッケージと API の依存関係の数や、特定のプロジェクトごとの移植性スコアを確認できます。アプリケーションの移植を既に開始していて、評価を再開した場合は、各プロジェクトの現在の移植ステータスも表示されます。

[プロジェクト] タブでプロジェクトが選択されていない場合、[Project references]、[NuGet packages]、[API]、および [ソースファイル] タブに表示されるデータはソリューション全体についてのものですが、必要に応じて、最初にプロジェクトを選択することでデータの範囲を指定できます。

[プロジェクト参照] タブには、パッケージの依存関係のグラフィカルビューが表示され、依存関係の大部分が消費されている場所を確認できます。ここでは、Npp.CoreNpp.Services、および Npp.Web.Framework プロジェクトです。このビューは、最初に作業を開始する場所を見極めるのに役立ち、開始する際に最大の「費用対効果」を得ることができます。プロジェクトを選択して、特定の依存関係をより明確に確認することもできます。

[NuGet packages] タブでは、互換性のある依存関係と互換性のない依存関係、および使用可能な場合は推奨される代わりの依存関係を確認できます。[API] タブには、互換性のない API、それらが含まれているパッケージ、それらが参照されている回数が一覧表示されます。[ソースファイル] には、アプリケーション内のプロジェクトを構成するすべてのソースファイルが一覧表示され、各ファイルで互換性のない API 呼び出しがいくつ見つかるかが示されます。ソースファイルを選択すると、互換性のない API が使用されている場所と、(存在する場合は) 問題を解決するためにアップグレードする推奨パッケージバージョンを示すビューが開きます。別のパッケージバージョンに更新するだけでは代替案が提示されない場合は、ソースエディターを開いて、別の API またはアプローチを使用するようにコードを更新する必要があります。ここでは、Nop.Web プロジェクトに存在し、Autofac NuGet パッケージを使用する DependencyRegistrar.cs のレポートを見ています。

Nop.Core プロジェクトからアプリケーションの移植を始めましょう。まず、[プロジェクト] タブに戻り、プロジェクトを選択して、[プロジェクトの移植] をクリックします。移植に際して、ツールは、プロジェクトの参照を NuGet パッケージに更新するのに役立つとともに、プロジェクトファイル自体を新しい .NET Core 形式に更新します。アプリケーションのソリューションファイル、プロジェクトファイル、およびソースファイルのコピーを作成するか、あるいは変更をインプレースで行うかを選択できます。ここでは、コピーを作成することにしました。

[保存] をクリックすると、アプリケーションのソースコードが選択した場所にコピーされ、新しいターゲットフレームワークのバージョン (この場合は netcoreapp3.1) と、アップグレードする必要のあるプロジェクトの NuGet 依存関係のリストを設定できる [プロジェクトの移植] ビューが開きます。Porting Assistant for .NET は、互換性のないパッケージごとに、可能なバージョンアップグレードのリストを提供します。各バージョンについて、残る互換性のない API の数か、さらに互換性がなくなる API の数が表示されます。ここで選択したパッケージには違いはありませんが、新しいバージョンで互換性のない API の数が増える可能性があるためにソースコードで手動で修正する必要がある場合、この情報は、最新バージョンのパッケージにアップグレードするか、古いバージョンのままにするかという、トレードオフの決定を下すのに役立ちます。

バージョンを選択すると、パッケージの横にある [非推奨の API 呼び出し] フィールドに、コードエディターで修正する必要がある内容が表示されます。値をクリックすると、非推奨の呼び出しが要約されます。

パッケージの依存関係ごとにこのプロセスを続行し、準備ができたら [ポート] をクリックして参照を更新します。IDE を使用して、ソースファイルに移動し、Porting Assistant for .NET のソースファイルと非推奨の API リストビューを参照として使用して、互換性のない API 呼び出しを置き換えることができ、アプリケーションの他のプロジェクトについても同様のプロセスを実行できます。

提案エンジンの改善
Porting Assistant for .NET の背後にある提案エンジンは、お客様がテレメトリの共有をオプトインすると、経時的に学習し、改善された結果を提供するように設計されています。エンジンの背後にあるデータモデルは、何百万ものパッケージバージョンを持つ何十万もの固有のパッケージを分析した結果であり、GitHub で入手できます。結果の正確性と完全性の向上のため、データ提供にぜひご協力ください。ユーザーガイドには、データがどのように使用されるのかについての詳細が記載されています。

Porting Assistant for .NET は無料でご利用いただけます。

— Steve