つばろぐ

主に C#, .NET, Azure の備忘録です。たまに日記。

.NET Coreのプロジェクトをproject.jsonから.csprojに変換してみた

.NET Coreのバージョンについては難しくて有名です。いまだに私もよく分かっていません。

blog.shibayan.jp

yfakariya.blogspot.jp

そんな.NET Coreですが、1.0がリリースされて以降、プロジェクトを構成するファイルが project.json から .csproj に変更されました。
.NET Frameworkなプロジェクトでは .csproj ですので、もとに戻ったという感じですね。

project.jsonから.csprojに移行するのはさほど難しくないという記事をちらっと見た気がしたので実際に移行してみました。
各作業はGitHubにコミットとして残してありますので、併せて見て頂けるとイメージしやすくなるかもしれません。

project.json形式でプロジェクトを作成する

Visual Studio 2015にて project.json形式のプロジェクトを作成します。
今回はASP.NET Core 1.0 MVCのWebアプリケーションで試しました。

github.com

この段階ではプロジェクトの構成情報は.xprojファイル、NuGetパッケージに関する情報等はproject.jsonにて管理されています。

project.jsonから.csprojへの移行方法を確認する

公式ドキュメントを読みましょう。

docs.microsoft.com

ドキュメントによればVisual Studio 2017か、dotnet migrateコマンドを使いましょうとあります。
ということで手っ取り早くVisual Studio 2017を使って移行をやってみます。

Visual Studio 2017でプロジェクトを開く

Visual Studio 2015で作成したプロジェクトをVisual Studio 2017で開くと、下のような「プロジェクトをアップグレードするよ」という旨のダイアログが最初に表示されます。

f:id:tech-tsubaki:20170506205604j:plain

ちなみにこちらが全文となります。

一方向のアップグレード
Visual Studio は、次のプロジェクトを開くために機能的な変更を自動的に行います。プロジェクトの作成に使用したバージョンの Visual Studio では、プロジェクトを開くことができなくなります。
     - Project2Csproj, "D:\src\yuta\project2csproj\src\Project2Csproj\Project2Csproj.xproj"


非機能的な変更が必要です
Visual Studio は、次のプロジェクトに Visual Studio 2015、Visual Studio 2013、Visual Studio 2012、および Visual Studio 2010 SP1 で開くための非機能的な変更を自動的に加えます。プロジェクトの動作への影響はありません。
     - Project2Csproj, "D:\src\yuta\project2csproj\Project2Csproj.sln"


変更は必要ありません
これらのプロジェクトは、変更せずに Visual Studio 2015、Visual Studio 2013、Visual Studio 2012、および Visual Studio 2010 SP1 で開くことができます。
     - src, "src"
     - Solution Items, "Solution Items"

このダイアログで「OK」を押せば、プロジェクトの変換が行われ、project.jsonから.csprojに変わります。
移行が終わった時点のコミットはこちらです。

github.com

.xproj, global.json, project.jsonがなくなり、.csprojに集約された感じですね。
あとVisual Studioのバージョンがあがったことで .NET Coreのランタイムも1.0.1から1.0.4にアップグレードされてますね。

疑問

ところでcsprojに移行したことで、global.jsonで指定されていた .NET Core SDKのバージョンの記載がどこにも見当たりません。
csprojに<RuntimeFrameworkVersion>1.0.4</RuntimeFrameworkVersion>という指定があるため、このランタイムバージョンが利用できるSDKが勝手に指定されるイメージなのでしょうか?
ファイルを読み取る以上、このあたりがどう指定されていくのかがよく分からずじまい・・・。

f:id:tech-tsubaki:20170506211339j:plain

ちなみにランタイム1.0.4で利用できるSDKのバージョンは1.0.11.0.3となります。

github.com