“dotnet pack”使用发布配置

dotnet pack 命令将代码打包到 NuGet 包中,现在默认使用 Release 配置而不是 Debug 配置。

以前的行为

以前,dotnet pack 使用 Debug 配置,除非显式指定配置或 PackRelease 设置为 true

.NET 7 中已添加PackRelease属性作为此重大更改的路径。 以前,您可以将环境变量设置为DOTNET_CLI_ENABLE_PACK_RELEASE_FOR_SOLUTIONS,以在属于 Visual Studio 解决方案的项目中使用PackRelease

新行为

如果使用 .NET 8 SDK 或更高版本进行开发,那么 dotnet pack 默认对所有项目使用 Release 配置。 如果已将 CI/CD 脚本、测试或代码硬编码 Debug 到输出路径,则此更改可能会中断工作流。 此外,除非显式指定了 Debug 配置(例如,使用 dotnet pack --configuration Debug),否则将无法调试打包的应用。

dotnet pack 可以同时打包多个目标框架名字对象 (TFM)。 如果您的项目针对多个目标框架(TFM)版本,并且为不同的 PackRelease 目标指定了不同的值,那么可能会发生冲突,即某些目标框架会打包Release 配置,而其他目标框架则会打包Debug 配置。

对于解决方案中的项目:

  • dotnet pack 如果给定解决方案文件,则可以打包 Visual Studio 解决方案中的所有项目。 对于解决方案中的每个项目,如果未定义,则将PackRelease的值隐式设置为true。 为了让 dotnet pack 确定要使用的正确配置,解决方案中的所有项目都必须就其PackRelease的值,达成一致。

  • 此更改可能会导致dotnet pack 的性能回退,尤其是对于包含多个项目的解决方案。 为了解决此问题,引入了新的环境变量 DOTNET_CLI_LAZY_PUBLISH_AND_PACK_RELEASE_FOR_SOLUTIONS

  • 环境变量 DOTNET_CLI_ENABLE_PACK_RELEASE_FOR_SOLUTIONS 不再被识别。

已引入的版本

.NET 8 预览版 1

破坏性变更的类型

此更改可能会影响 源兼容性 ,也是 行为更改

更改原因

在大多数情况下,创建包时,希望优化代码,并通过排除调试信息来减小包。

已删除 DOTNET_CLI_ENABLE_PACK_RELEASE_FOR_SOLUTIONS 环境变量,因为它启用的行为现在是默认行为,并且不再需要精细控件。

  • 若要完全禁用新行为,可以将环境变量设置为 DOTNET_CLI_DISABLE_PUBLISH_AND_PACK_RELEASEtrue (或任何其他值)。 此变量影响 dotnet publishdotnet pack

  • 若要显式指定Debug打包的配置,请使用-c--configuration选项与dotnet pack一起。

  • 如果您的 CI/CD 管道因硬编码的输出路径而中断,请将路径更新为 Release 而不是 Debug。使用 DOTNET_CLI_DISABLE_PUBLISH_AND_PACK_RELEASE 环境变量禁用新行为,或指定应使用 Debug 配置。

  • 如果要打包解决方案,但解决方案由于一个或多个项目显式设置 PackRelease 的值而损坏,则应在每个项目中将 PackRelease 显式设置为 false

    <PropertyGroup>
      <PackRelease>false</PackRelease>
    </PropertyGroup>
    
  • 如果要打包解决方案并且性能已回归,可以将环境变量设置为 DOTNET_CLI_LAZY_PUBLISH_AND_PACK_RELEASE_FOR_SOLUTIONStrue (或任何其他值)以删除回归。 如果使用此变量和任何项目定义 PackRelease,则所有项目都必须定义它,也可以使用 Directory.Build.Props 文件。 此变量影响 dotnet publishdotnet pack

另请参阅