web-dev-qa-db-ja.com

Microsoft.NET.SdkとMicrosoft.NET.Sdk.Webの違いは何ですか

2つのホストプロジェクト(1つは Webホスト 、もう1つは 汎用ホスト )と、これら2つのホストプロジェクトによって参照されるクラスライブラリプロジェクトを使用したソリューションがあります。

* .csprojファイルのルートタグ<Project>Sdk 属性では、両方のホストプロジェクト(Webホストと汎用ホスト)がMicrosoft.NET.Sdk.Webを使用していますが、クラスライブラリプロジェクトはMicrosoft.NET.Sdkを使用しています。

2つのホストプロジェクトは、Microsoft.AspNetCore.Appメタパッケージを参照します。

クラスライブラリプロジェクトはMicrosoft.NETCore.Appを使用していますが、ASP.NET Coreパッケージ(Microsoft.AspNetCore.AppにないMicrosoft.NETCore.Appのパッケージ)を個別に参照しています。

正しいSDKおよびメタパッケージについて:

1)汎用ホストプロジェクトでは、ASP.NET Coreの代わりに純粋な。NET CoreMicrosoft.NET.SdkおよびMicrosoft.NETCore.App)を使用する必要があります(Microsoft.NET.Sdk.WebおよびMicrosoft.AspNetCore.App)これはWebプロジェクトではないのですか?

2)クラスライブラリプロジェクトで、Microsoft.NET.SdkMicrosoft.AspNetCore.Appとともに使用して、Microsoft.AspNetCore.Appに属するパッケージの異なるバージョンを参照する可能性を回避することは問題ありませんか(たとえば、ホストプロジェクトでは[email protected]、クラスライブラリプロジェクトでは[email protected])。または、Microsoft.AspNetCore.AppメタパッケージをMicrosoft.NET.Sdk.Web SDKでのみ使用できますか?

3)Microsoft.NET.SdkまたはMicrosoft.NET.Sdk.Webを使用するとどのような違いがありますか? docsと言います。「SDKは、階層化ドキュメントで説明されているように、.NET CoreコードをビルドできるMSBuildタスクとターゲットのセットです。」 、しかし、なぜ両方を必要とするのですか?実際には、そのMicrosoft.NET.Sdk.WebがしないMicrosoft.NET.Sdkは何ですか?

19
lmcarreiro

広告(1)と(3):「コア」とWeb SDKの違いは何ですか、これらは一般的なホストアプリにどのように影響しますか?

最も重要な違いは次のとおりです。

  1. デフォルトアイテム

    Web SDKには、公開アプリケーションに含めるファイルのさまざまな定義とグロビングパターンがあります。

    例えば。 appsettings.jsonファイルがある場合、.config.jsonファイルおよびwwwrootフォルダー内のすべてのファイルがすべてであることを保証するパターンがあるため、Web SDKを使用するプロジェクトには自動的に含まれますパブリッシュ出力の一部。 これらのパターンについてはGitHubのMSBuildソースコード を参照してください。

    汎用ホストがあり、Web SDKを使用しない場合は、csprojファイルにコードを追加して、どのファイルを発行ディレクトリにコピーするかを指定する必要があります(またはIDEを使用して「出力ディレクトリにコピー」設定を変更します。この設定では、パブリッシュ出力にもファイルが含まれますが、ビルド出力にもコピーされます)。

    <ItemGroup>
      <None Update="*.json" CopyToPublishDirectory="PreserveNewest" />
    </ItemGroup>
    
  2. Web公開ロジック

    Web SDKのもう1つの重要な部分は、Webアプリケーションの展開ロジックが含まれていることです。

    発行プロファイル(.pubxmlファイル)を使用するか、MSBuild/MSDeployを使用してAzureまたはファイルシステムにデプロイする場合、この発行ロジックが必要になります。

広告(2):クラスライブラリに使用するSDK

パブリックライブラリを公開する際の互換性を最大限にするには(NuGetなどを使用)、コアSDKを使用し、可能な限り低いバージョンの個々のパッケージを参照します2.1.0/2.1.1。

カミソリビューを含むクラスライブラリを開発する場合、Microsoft.NET.Sdk.Razor SDKを使用してカミソリツールを取得する必要があります(たとえば、dotnet new razorclasslibテンプレートを使用する場合)。

アプリケーションと同じメタパッケージ参照を使用するライブラリとテストプロジェクトの場合、現時点では事態は少し複雑ですが、改善されるでしょう:

ASP.NET Core 2.1ツール(!)(CLI 2.1。*)の場合、クラスライブラリに非Web SDKを使用し、そのパッケージのバージョン2.1.1を使用することをお勧めします。 NuGetがアップグレードを提供している場合でも、アップグレードしないでください。

2.1ツール(!)(CLI 2.1。*)のテストプロジェクトについては、少し異なり、注意が必要です。 統合および単体テストがASP.NET Core 2.1で動作しなくなり、実行時にアセンブリが見つからない =

2.2ツール(CLI 2.2.100+)以降、ASP.NET Coreメタパッケージへのバージョンレスパッケージ参照がコアSDKに移動されるため、「ASP.NET Core 2.1および2.2の両方でライブラリを開発し、プロジェクトをテストできます」バージョンレスパッケージ参照を使用した「コア」SDK(ツール2.2.100以降を使用する場合):

<ItemGroup>
  <PackageReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>

.NET Core/ASP.NET Core 3.0では、新しいメカニズムを使用してフレームワークを完全に参照できます(web-SDKは不要です)。

<ItemGroup>
  <FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
24
Martin Ullrich