.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
目标创建了以下 MSBuild 项,其中包含 NuGet 资产文件中的信息:
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.resx”的资源文件的生成清单名称是“MyProject.Form1.resources”。
从 .NET Core 3.0 开始,如果资源文件与同名的源文件(例如 Form1.resx 和 Form1.cs)并置,则 MSBuild 将使用源文件中的类型信息在 <Namespace>.<ClassName>.resources
模式中生成清单文件名。 命名空间和类名称是从并置源文件的第一个类型中提取的。 例如,与名为“Form1.cs”的源文件并置的、名为“Form1.resx”的资源文件的生成清单名称是“MyNamespace.Form1.resources”。 需要注意的一点是,文件名的第一部分不同于早期版本的 .NET Core(是 MyNamespace,而不是 MyProject)。
注意
如果已在项目文件中的 EmbeddedResource
项上指定 LogicalName
、ManifestResourceName
或 DependentUpon
元数据,则此更改不会影响该资源文件。
此重大更改是在 .NET Core 项目中添加 EmbeddedResourceUseDependentUponConvention
属性时引入的。 默认情况下,不会在 .NET Core 项目文件中显式列出资源文件,因此它们没有 DependentUpon
元数据来指定如何命名生成的 .resources 文件。 如果 EmbeddedResourceUseDependentUponConvention
设置为 true
(默认值),则 MSBuild 将查找并置的源文件,并从该文件中提取命名空间和类名。 如果将 EmbeddedResourceUseDependentUponConvention
设置为 false
,则 MSBuild 将根据之前的行为生成清单名称,将 RootNamespace
和相对文件路径组合在一起。
建议操作
在大多数情况下,开发人员不需要执行任何操作,应用应可以继续工作。 但是,如果此更改造成应用中断运行,你可以:
将代码更改为需要新的清单名称。
在项目文件中将
EmbeddedResourceUseDependentUponConvention
设置为false
,以选择退出新命名约定。<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
不适用