.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 より前では、プロジェクト ファイルの EmbeddedResource
項目に LogicalName
、ManifestResourceName
、または DependentUpon
メタデータが指定されなかった場合、MSBuild ではパターン <RootNamespace>.<ResourceFilePathFromProjectRoot>.resources
でマニフェスト ファイル名が生成されていました。 RootNamespace
がプロジェクト ファイルで定義されていない場合は、既定でそのプロジェクトの名前になります。 たとえば、ルート プロジェクト ディレクトリ内の Form1 という名前のリソース ファイルに対して生成されたマニフェスト名は、MyProject.Form1.resources でした。
.NET Core 3.0 以降では、あるリソース ファイルが同じ名前のソース ファイルと併置されている場合 (たとえば、Form1.resx と Form1.cs)、MSBuild ではそのソース ファイルの型情報が使用されてパターン <Namespace>.<ClassName>.resources
でマニフェスト ファイル名が生成されます。 名前空間とクラス名は、併置されたソース ファイルの最初の型から抽出されます。 たとえば、Form1.cs という名前のソース ファイルと併置されている Form1 という名前のリソース ファイルに対して生成されたマニフェスト名は、MyNamespace.Form1.resources になります。 重要な注意点として、.NET Core の以前のバージョンとはファイル名の最初の部分が異なります (MyProject ではなく MyNamespace)。
注意
プロジェクト ファイルの EmbeddedResource
項目で LogicalName
、ManifestResourceName
、または DependentUpon
メタデータが指定されている場合、この変更はそのリソース ファイルには影響しません。
この破壊的変更は、.NET Core プロジェクトへの EmbeddedResourceUseDependentUponConvention
プロパティの追加によって導入されました。 既定では、リソース ファイルは .NET Core プロジェクト ファイルに明示的にリストされていないため、生成された .resources ファイルに名前を付ける方法を指定するための DependentUpon
メタデータはありません。 EmbeddedResourceUseDependentUponConvention
が true
に設定されている場合 (既定)、MSBuild では併置されたソース ファイルが検索され、そのファイルから名前空間とクラス名が抽出されます。 EmbeddedResourceUseDependentUponConvention
を false
に設定すると、MSBuild では RootNamespace
と相対ファイル パスを組み合わせた前の動作に従ってマニフェスト名が生成されます。
推奨アクション
ほとんどの場合、開発者側でアクションを取る必要はなく、アプリは引き続き動作するはずです。 ただし、この変更によってアプリに影響が出ている場合は、次のいずれかを実行してください。
新しいマニフェスト名を要求するようにコードを変更する。
プロジェクト ファイルで
EmbeddedResourceUseDependentUponConvention
をfalse
に設定して、新しい名前付け規則を無効にする。<PropertyGroup> <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention> </PropertyGroup>
カテゴリ
MSBuild
影響を受ける API
N/A
.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
該当なし
.NET