如果目标框架为 .NET 8 或更高版本,则dotnet publish命令默认使用Release配置而不是Debug配置。
以前的行为
以前,dotnet publish 使用 Debug 配置,除非显式指定配置或 PublishRelease 设置为 true。
.NET 7 中已添加PublishRelease属性作为此重大更改的路径。 以前,您可以将环境变量设置为DOTNET_CLI_ENABLE_PUBLISH_RELEASE_FOR_SOLUTIONS,以在属于 Visual Studio 解决方案的项目中使用PublishRelease。
新行为
如果您使用 .NET 8 SDK 或更高版本进行开发,对于dotnet publish设置为Release或更高版本的项目,TargetFramework默认使用net8.0配置。 如果已将 CI/CD 脚本、测试或代码硬编码 Debug 到输出路径,则此更改可能会中断工作流。
如果您的项目面向多个版本,则只有在发布时指定 .NET 8 或更高版本的目标框架时,新的行为才会适用(例如,使用 dotnet publish -f net8.0)。
对于解决方案中的项目:
dotnet publish如果给定解决方案文件,则可以发布 Visual Studio 解决方案中的所有项目。 对于面向 .NET 8 或更高版本的解决方案项目,如果PublishRelease未定义,则该值会被隐式设置为true。 为了确保dotnet publish能确定用于解决方案的正确配置,解决方案中的所有项目都必须在他们的PublishRelease配置值上达成一致。 如果解决方案中的较旧项目已将PublishRelease设置为false,那么对于任何新的 .NET 8+ 项目,您也应明确将该属性设置为false。此更改可能会导致
dotnet publish的性能回退,尤其是对于包含多个项目的解决方案。 为了解决此问题,引入了新的环境变量DOTNET_CLI_LAZY_PUBLISH_AND_PACK_RELEASE_FOR_SOLUTIONS。环境变量
DOTNET_CLI_ENABLE_PUBLISH_RELEASE_FOR_SOLUTIONS不再被识别。
已引入的版本
.NET 8 预览版 1
破坏性变更的类型
更改原因
在大多数情况下,当你发布时,你希望优化代码,并且可以通过排除调试信息来缩小应用。 客户长期以来一直要求将 Release 设置为 publish 的默认配置。 此外,Visual Studio 多年来一直存在此行为。
已删除 DOTNET_CLI_ENABLE_PUBLISH_RELEASE_FOR_SOLUTIONS 环境变量,因为它启用的行为现在是默认行为,并且不再需要精细控件。
建议的措施
若要完全禁用新行为,可以将环境变量设置为
DOTNET_CLI_DISABLE_PUBLISH_AND_PACK_RELEASEtrue(或任何其他值)。 此变量影响dotnet publish和dotnet pack。要显式指定
Debug配置用于发布,请将-c或--configuration选项与dotnet publish结合使用。如果您的 CI/CD 管道因硬编码的输出路径而中断,请将路径更新为
Release而不是Debug。使用DOTNET_CLI_DISABLE_PUBLISH_AND_PACK_RELEASE环境变量禁用新行为,或指定应使用Debug配置。如果您发布的解决方案已损坏,可以将
PublishRelease显式设置为true(或将false还原为以前的行为)。<PropertyGroup> <PublishRelease>true</PublishRelease> </PropertyGroup>或者,可以在 Directory.Build.Props 文件中指定属性。 但是,如果在此文件中对其进行设置
false,则仍需在解决方案的 .NET 8+ 项目中显式设置该属性false。 同样,如果某些项目显式设置的值与 Directory.Build.Props 文件中的值不同,则发布将失败。如果要发布解决方案和性能已回归,可以将环境变量设置为
DOTNET_CLI_LAZY_PUBLISH_AND_PACK_RELEASE_FOR_SOLUTIONStrue(或任何其他值)以删除回归。 但是,如果设置此变量,并且解决方案包含 .NET 8+ 项目和面向 .NET 7 或更早版本的项目,则发布将失败,直到所有项目都定义PublishRelease。 此变量影响dotnet publish和dotnet pack。