O 'dotnet pack' usa a configuração Release

O comando dotnet pack, que empacota o código em um pacote NuGet, agora usa a configuração Release em vez da configuração Debug por padrão.

Comportamento anterior

Antes, dotnet pack usava a configuração Debug, a menos que a configuração fosse especificada explicitamente ou que PackRelease fosse definida como true.

A propriedade PackRelease foi adicionada ao .NET 7 visando essa alteração interruptiva. Antes, era possível definir a variável de ambiente DOTNET_CLI_ENABLE_PACK_RELEASE_FOR_SOLUTIONS para usar PackRelease em um projeto que fazia parte de uma solução do Visual Studio.

Novo comportamento

Se você estiver desenvolvendo com o SDK do .NET 8 ou uma versão posterior, o dotnet pack usará a configuração Release por padrão em todos os projetos. Se você tiver um script, testes ou um código de CI/CD com Debug embutido em código em um caminho de saída, essa alteração poderá interromper o fluxo de trabalho. Além disso, você não poderá depurar um aplicativo empacotado, a menos que a configuração Debug seja especificada explicitamente (por exemplo, usando dotnet pack --configuration Debug.

dotnet pack pode empacotar para vários TFM (Monikers da Estrutura de Destino) ao mesmo tempo. Se o projeto for direcionado a várias versões e houver valores de PackRelease diferentes para destinos diferentes, poderá haver um conflito em que alguns TFMs empacotam a configuração Release e outros empacotam a configuração Debug.

Para projetos em uma solução:

  • dotnet pack poderá empacotar todos os projetos em uma solução do Visual Studio se receber um arquivo de solução. Para cada projeto na solução, o valor de PackRelease será definido implicitamente como true se for indefinido. Para que dotnet pack determine a configuração correta a ser usada, todos os projetos na solução precisam concordar com respectivo valor de PackRelease.

  • Essa alteração pode regredir o desempenho de dotnet pack, principalmente em soluções que contêm muitos projetos. Para resolver isso, uma nova variável de ambiente DOTNET_CLI_LAZY_PUBLISH_AND_PACK_RELEASE_FOR_SOLUTIONS foi introduzida.

  • A variável de ambiente DOTNET_CLI_ENABLE_PACK_RELEASE_FOR_SOLUTIONS não é mais reconhecida.

Versão introduzida

.NET 8 versão prévia 1

Tipo de alteração interruptiva

Essa alteração pode afetar a compatibilidade de origem e também é uma alteração comportamental.

Motivo da alteração

Na maioria dos casos, ao criar um pacote, o ideal é manter o código otimizado e o pacote menor excluindo as informações de depuração.

A variável de ambiente DOTNET_CLI_ENABLE_PACK_RELEASE_FOR_SOLUTIONS foi removida, pois o comportamento habilitado agora é o padrão e o controle granular não é mais necessário.

  • Para desabilitar totalmente o novo comportamento, você pode definir a variável de ambiente DOTNET_CLI_DISABLE_PUBLISH_AND_PACK_RELEASE como true (ou qualquer outro valor). Essa variável afeta dotnet publish e dotnet pack.

  • Para especificar explicitamente a configuração Debug para empacotamento, use a opção -c ou --configuration com dotnet pack.

  • Se o pipeline de CI/CD estiver interrompido devido a caminhos de saída embutidos em código, atualize os caminhos para Release em vez de Debug, desabilite o novo comportamento usando a variável de ambiente DOTNET_CLI_DISABLE_PUBLISH_AND_PACK_RELEASE ou especifique que a configuração Debug deve ser usada.

  • Se você estiver empacotando uma solução e ela estiver interrompida porque um ou mais projetos definem explicitamente um valor para PackRelease, defina PackRelease explicitamente para false em cada projeto:

    <PropertyGroup>
      <PackRelease>false</PackRelease>
    </PropertyGroup>
    
  • Se você estiver empacotando uma solução e o desempenho tiver regredido, defina a variável de ambiente DOTNET_CLI_LAZY_PUBLISH_AND_PACK_RELEASE_FOR_SOLUTIONS como true (ou qualquer outro valor) para remover a regressão. Se você usar essa variável e qualquer projeto definir PackRelease, todos os projetos deverão defini-la ou você poderá usar um arquivo Directory.Build.Props. Essa variável afeta dotnet publish e dotnet pack.

Confira também