“dotnet publish”使用发布配置
如果目标框架为 .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
默认对 TargetFramework
设置为 net8.0
或更高版本的项目使用 Release
配置。 如果有 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_RELEASE
环境变量设置为true
(或任何其他值)。 此变量同时影响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_SOLUTIONS
环境变量设置为true
(或任何其他值)以删除回归。 但是,如果设置此变量,并且解决方案包含 .NET 8+ 项目和面向 .NET 7 或更早版本的项目,那么在所有项目定义PublishRelease
之前,发布将失败。 此变量同时影响dotnet publish
和dotnet pack
。