Поделиться через


"dotnet publish" использует конфигурацию Release

Теперь dotnet publish команда использует Release конфигурацию вместо Debug конфигурации по умолчанию, если целевая платформа — .NET 8 или более поздняя версия.

Предыдущее поведение

Ранее dotnet publish использовал Debug конфигурацию, если конфигурация не была указана явным образом или PublishRelease была установлена как true.

СвойствоPublishRelease было добавлено в .NET 7 в качестве пути к этому критическому изменению. Ранее можно задать DOTNET_CLI_ENABLE_PUBLISH_RELEASE_FOR_SOLUTIONS переменную среды для использования PublishRelease в проекте, который был частью решения Visual Studio.

Новое поведение

Если вы разрабатываете с использованием .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, следует явно установить свойство false для любых новых проектов .NET 8 и более поздних версий.

  • Это изменение может привести к снижению производительности 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 в этом файле, вам всё равно придётся явно установить свойство false в проектах .NET 8+ в составе решения. Аналогичным образом, если некоторые проекты явно задают значение, отличное от значения в файле Directory.Build.Props, публикация не удастся.

  • Если при публикации решения производительность ухудшилась, можно установить переменную среды DOTNET_CLI_LAZY_PUBLISH_AND_PACK_RELEASE_FOR_SOLUTIONS в значение true (или любое другое значение), чтобы устранить регрессию. Однако, если задать эту переменную и решение содержит проект .NET 8+ и проект, предназначенный для .NET 7 или более ранней версии, публикация завершится ошибкой до тех пор, пока все проекты не будут определены PublishRelease. Эта переменная влияет как на dotnet publish, так и на dotnet pack.

См. также