web-dev-qa-db-ja.com

非コアcsprojをVS2017形式に変換する方法

VS2015には2つのプロジェクトがあります

  1. 1つの.NET Core(project.json、xproj)
  2. 1つの通常の.NET csproj

VS2017でプロジェクト1を開くと、新しいcsproj形式にうまく移行します。

Project 2はVS2017で動作しますが、このcsprojを新しいプロジェクトファイル形式に変換/移行/更新して、新しいcsproj機能(マルチターゲット、大きなファイルリストなし、読み取り可能なcsproj、csprojのNuSpec情報など)の恩恵を受けることが好きです

どうすればそれができますか?そのためのVS2017でオプションを見つけることができません。

使用:VS2017 RTM

21
Julian

クリーナーcsprojは主に.NET Coreプロジェクト用であるため、VSに組み込まれたオプションはありません。他のすべての種類のプロジェクトでは、プロジェクトファイルで多少の労力とさらなるカスタマイズを行わないと完全に機能しません。たとえば、コードジェネレーターやWinformsやWPFアプリでのネストなどの接続は、新しいSDKスタイル(新しいスタイル).csprojの場合はそのままでは機能しない場合があります。これらは通常、必要に応じてメタデータを更新することで回避できます。

<ItemGroup>
  <Compile Update="Properties\Resources.Designer.cs">
    <AutoGen>True</AutoGen>
    <DependentUpon>Resources.resx</DependentUpon>
  </Compile>
</ItemGroup>

ここでは、更新属性が重要です。ItemGroupにファイルをもう一度含めるのではなく、既存の(または不足している)メタデータを更新するだけです。

また、一部のプロジェクトタイプには、SDKベースのcsprojと以前のバージョンではターゲットが期待どおりにインポートされないという注意事項もあります。これはターゲットの作成方法に依存しますが、その一例として、VSSDKを使用してVSIXプロジェクト(VS拡張)を構築することは、SDKベースのプロジェクトで正しく実行することが非常に困難です。

変換を試してみたい場合は、 Nate McMasterのブログ投稿 が優れたリソースです。彼は、ゼロから始めて、その場でファイルを変換することの両方を扱っています。ほとんどの場合、新しいクリーンな.csprojで開始し、必要な回避策を追加するとかなりスムーズに進むことがわかりました。

また、通常のcsprojファイルの多くのがらくたは生成されたコンテンツであり、手作業で少し編集するだけでクリーンアップにつながることも指摘しておく価値があります。たとえば、グロビングパターンを使用すると、大きなプロジェクトファイルに何百行も保存できます。これは、SDKベースのプロジェクトがとにかく動作する方法の一部です-SDKでグロブを実行するだけなので、.csprojには表示されませんが、ほぼ同じように動作します。たとえば、フォルダーの下にすべてのC#ファイルを(再帰的に)含めたい場合、次のようなことができます。

<ItemGroup>
  <!-- Include all C# files under the SampleFolder and any child folders -->
  <Compile Include="SampleFolder\**\*.cs" />
  <!-- Include all C# files under this project's root: -->
  <Compile Include="**\*.cs" />
<ItemGroup>

**は、再帰的なフォルダーパスと一致します。

SDKベースのプロジェクトの新しいプロジェクトシステムは古い.csprojプロジェクトシステムとは非常に異なるため、Visual Studioの動作にはいくつかの違いがあります。たとえば、SDKプロジェクトはディスク上のファイルが変更されると自動的に検出し、プロジェクトでそれらを追加/削除します。 old-csprojは、プロジェクトがリロードされるまで、VSでそれらを更新しません。

どこでもグロビングを使用すると、SDKベースのcsprojと同様の問題が発生します。特定のファイルがコードジェネレーターに接続されていないか、正しくネストされていません。上記のように、Update=属性を使用して、特定のファイル(またはさらに特定のglob)を修正し、メタデータを同じものに戻すことができます。

3
Jimmy

これらを見るのに時間をかける価値があるかもしれません。より複雑なプロジェクトタイプでは実行できないように見えますが、コンソールとライブラリはアップグレード可能であるようです http://www.natemcmaster.com/blog/2017/03/09/vs2015-to-vs2017-アップグレード/

https://github.com/NickCraver/PerfBenchmarks/commit/53c3013b1774056363dcab867bceb1b89ce9592c

また、より複雑なSDKタイプの追加に関しては、このgithubの問題を見ることができます。

https://github.com/dotnet/sdk/issues/491

8
SkyrawrCode