次の方法で共有


.NET Core 2.1 - 3.1 での MSBuild の破壊的変更

このページでは、次の破壊的変更について説明します。

重大な変更 導入されたバージョン
デザイン時ビルドでは、最上位レベルのパッケージ参照のみが返されます 3.1
リソース マニフェストのファイル名の変更 3.0
プロジェクト ツールが SDK に含まれるようになりました 2.1

.NET Core 3.1

デザイン時ビルドでは、最上位レベルのパッケージ参照のみが返されます

.NET Core SDK 3.1.400 以降では、最上位レベルのパッケージ参照のみが RunResolvePackageDependencies ターゲットによって返されます。

導入されたバージョン

.NET Core SDK 3.1.400

変更の説明

以前のバージョンの .NET Core SDK では、 RunResolvePackageDependencies ターゲットによって、NuGet アセット ファイルの情報を含む次の MSBuild 項目が作成されました。

  • PackageDefinitions
  • PackageDependencies
  • TargetDefinitions
  • FileDefinitions
  • FileDependencies

このデータは、ソリューション エクスプローラーの [依存関係] ノードを設定するために Visual Studio によって使用されます。 ただし、大量のデータになる可能性があり、依存関係ノードが展開されない限り、データは必要ありません。

.NET Core SDK バージョン 3.1.400 以降では、これらの項目のほとんどは既定では生成されません。 Package型の項目のみが返されます。 依存関係ノードに項目を設定する必要がある場合、Visual Studio は資産ファイルから直接情報を読み取ります。

変更の理由

これは、Visual Studio 内のソリューション読み込みパフォーマンスを向上させるために導入されました。 以前は、すべてのパッケージ参照が読み込まれており、それには、ほとんどのユーザーが決して表示しない多くの参照の読み込みも含まれていました。

作成されるこれらの項目に依存する MSBuild ロジックがある場合は、 EmitLegacyAssetsFileItems プロパティをプロジェクト ファイル内の true に設定します。 この設定により、すべての項目が作成される前の動作が有効になります。

カテゴリ

MSBuild

影響を受ける API

なし


.NET Core 3.0

リソース マニフェストのファイル名の変更

.NET Core 3.0 以降では、既定の場合、MSBuild によってリソース ファイルに対して異なるマニフェスト ファイル名が生成されます。

導入されたバージョン

3.0

変更の説明

.NET Core 3.0 より前では、プロジェクト ファイルの LogicalName 項目に ManifestResourceNameDependentUpon、または EmbeddedResource メタデータが指定されなかった場合、MSBuild ではパターン <RootNamespace>.<ResourceFilePathFromProjectRoot>.resources でマニフェスト ファイル名が生成されていました。 RootNamespace がプロジェクト ファイルで定義されていない場合は、既定でそのプロジェクトの名前になります。 たとえば、ルート プロジェクト ディレクトリ内の Form1 という名前のリソース ファイルに対して生成されたマニフェスト名は、MyProject.Form1.resources でした。

.NET Core 3.0 以降では、あるリソース ファイルが同じ名前のソース ファイルと併置されている場合 (たとえば、Form1.resxForm1.cs)、MSBuild ではそのソース ファイルの型情報が使用されてパターン <Namespace>.<ClassName>.resources でマニフェスト ファイル名が生成されます。 名前空間とクラス名は、併置されたソース ファイルの最初の型から抽出されます。 たとえば、Form1.cs という名前のソース ファイルと併置されている Form1 という名前のリソース ファイルに対して生成されたマニフェスト名は、MyNamespace.Form1.resources になります。 重要な注意点として、.NET Core の以前のバージョンとはファイル名の最初の部分が異なります (MyProject ではなく MyNamespace)。

プロジェクト ファイルの LogicalName 項目で ManifestResourceNameDependentUpon、または EmbeddedResource メタデータが指定されている場合、この変更はそのリソース ファイルには影響しません。

この破壊的変更は、.NET Core プロジェクトへの EmbeddedResourceUseDependentUponConvention プロパティの追加によって導入されました。 既定では、リソース ファイルは .NET Core プロジェクト ファイルに明示的にリストされていないため、生成された DependentUpon ファイルに名前を付ける方法を指定するための メタデータはありません。 EmbeddedResourceUseDependentUponConventiontrue に設定されている場合 (既定)、MSBuild では併置されたソース ファイルが検索され、そのファイルから名前空間とクラス名が抽出されます。 EmbeddedResourceUseDependentUponConventionfalse に設定すると、MSBuild では RootNamespace と相対ファイル パスを組み合わせた前の動作に従ってマニフェスト名が生成されます。

ほとんどの場合、開発者側でアクションを取る必要はなく、アプリは引き続き動作するはずです。 ただし、この変更によってアプリに影響が出ている場合は、次のいずれかを実行してください。

  • 新しいマニフェスト名を要求するようにコードを変更する。

  • プロジェクト ファイルで EmbeddedResourceUseDependentUponConventionfalse に設定して、新しい名前付け規則を無効にする。

    <PropertyGroup>
      <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention>
    </PropertyGroup>
    

カテゴリ

MSBuild

影響を受ける API

なし


.NET Core 2.1

プロジェクト ツールが SDK に含まれるようになりました

.NET Core 2.1 SDK には一般的な CLI ツールが含まれるようになり、プロジェクトからこれらのツールを参照する必要がなくなりました。

変更の説明

.NET Core 2.0 では、プロジェクトは、 <DotNetCliToolReference> プロジェクト設定で外部 .NET ツールを参照します。 .NET Core 2.1 では、これらのツールの一部が .NET Core SDK に含まれており、設定は不要です。 これらのツールへの参照をプロジェクトに含める場合は、次のようなエラーが表示されます。 ツール 'Microsoft.EntityFrameworkCore.Tools.DotNet' が .NET Core SDK に含まれるようになりました。

.NET Core 2.1 SDK に含まれるツール:

<DotNetCliToolReference> 値 道具
Microsoft.DotNet.Watcher.Tools dotnet-watch
Microsoft.Extensions.SecretManager.Tools dotnet-user-secrets
Microsoft.Extensions.Caching.SqlConfig.Tools dotnet-sql-cache
Microsoft.EntityFrameworkCore.Tools.DotNet dotnet-ef

導入されたバージョン

.NET Core SDK 2.1.300

プロジェクトから <DotNetCliToolReference> 設定を削除します。

カテゴリ

MSBuild

影響を受ける API

なし