Как установить ложь отладки для режима выпуска

У меня есть этот файл web.config с параметром компиляции, указанным ниже

Web.config

<configuration>
...
<system.web>
    <compilation debug="true" targetFramework="4.5" />
    ...
</system.web>
</configuration>

А вот что Visual Studio по умолчанию устанавливает для режима выпуска.

Web.Release.config

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
 <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
 </system.web>
</configuration>

Я использую это для проекта MVC4. Основываясь на этом руководстве, я ожидал, что уменьшенные версии js и css будут обслуживаться, когда приложение запущено в режиме выпуска. Но, похоже, это не работает, и обслуживаются неминифицированные версии js и css. С другой стороны, если я явно установил для отладки значение false в web.config, то минимальные версии обслуживаются правильно.

Кажется, проблема с преобразованием тега компиляции возникает, когда приложение запускается в режиме выпуска, но я не понимаю, что не так с тем же в Web.Release.config.

Короче говоря, я не могу запустить объединение и минификацию, запустив приложение в режиме выпуска.


comment
Бьюсь об заклад, это происходит потому, что ваше приложение работает в виртуальном каталоге родительского приложения в IIS и наследует его конфигурацию, когда она отсутствует, поэтому она исправляет ее, когда она присутствует, переопределяя родительскую конфигурацию!   -  person Bon    schedule 14.08.2015


Ответы (6)


Преобразования Web.config, как они определены в Web.Release.config, выполняются только при развертывании / публикации проекта для соответствующей конфигурации.

Простое изменение активной конфигурации в Visual Studio на Release и запуск приложения не приводит к выполнению преобразований. Таким образом, файл web.config остается неизменным. Кстати, такое поведение разумно, поскольку веб-приложение запускается из каталога проекта, содержащего исходный файл web.config. Если бы Visual Studio преобразовала файл web.consign, исходный файл web.config был бы изменен.

Если вы еще не создали профиль развертывания, вы можете опубликовать свое приложение в файловой системе, чтобы проверить поведение. Выберите Release в качестве конфигурации для запуска развертывания. Преобразования должны выполняться должным образом.

person Markus    schedule 28.02.2014
comment
Я уже некоторое время чесал в затылке. Кстати, откуда визуальная студия localhost временно запускает сайт. Я имею ввиду из какого каталога. Скажем, когда я отлаживаю веб-сайт с помощью Visual Studio, я хочу проверить, что попадает в web.config. - person Jatin; 28.02.2014
comment
@Nirvan: AFAIK при запуске приложения из VS используется папка разработки. Вот почему VS не может преобразовать web.config тогда, потому что это изменит начальную точку преобразования. - person Markus; 28.02.2014
comment
@Nirvan: еще одна вещь: если у вас также есть преобразования для отладки в файле Web.Debug.config, они также будут применяться только при развертывании. Это может привести к разным файлам debug-web.configs. - person Markus; 28.02.2014
comment
Также проверьте этот инструмент на AppHarbor: webconfigtransformationtester.apphb.com - person nmit026; 24.05.2017
comment
@ nmit026 спасибо за подсказку. Выглядит хорошо и обязательно поможет при создании трансформации - person Markus; 24.05.2017

Мой ответ может быть запоздалым, но вот что со мной сработало:

Я изменил строчку:

<compilation xdt:Transform="RemoveAttributes(debug)" />

to :

<compilation xdt:Transform="Replace" debug="false" targetFramework="4.5" />

это в основном помогло, так как я думаю, оптимизатор ищет значение Debug и == "false".

Надеюсь, это поможет людям, которые не хотят управлять этим из кода.

person Omar.Alani    schedule 29.04.2015
comment
Просто примечание, Replace удалит весь элемент. Когда я использовал это, мой список включенных сборок был удален, и я начал получать следующую ошибку. Тип System.Object определен в сборке, на которую нет ссылок. Вы должны добавить ссылку на сборку System.Runtime, Version = 4.0.0.0, Culture = нейтральный, PublicKeyToken = b03f5f7f11d50a3a. - person leemicw; 19.06.2015

Если вы хотите протестировать объединение и минификацию .NET, которые вы настроили в файле Global.asax, вы также можете использовать нотацию предварительной компиляции ... например

#if DEBUG
  BundleTable.EnableOptimizations = false;
#else
  BundleTable.EnableOptimizations = true;
#endif

При этом вашему приложению не нужно будет запускать преобразование в операции сборки, и оно будет работать так, как вы этого хотите.

person beauXjames    schedule 16.10.2014

Возможно, это улучшение ответа Омара Алани:

В преобразовании Release замените строку:

<compilation xdt:Transform="RemoveAttributes(debug)" />

со следующим:

<compilation debug="false" xdt:Transform="SetAttributes" />
person davrob01    schedule 14.09.2017

compilation debug="false" xdt:Transform="SetAttributes"

пригодится, когда вы активируете преобразования XML во время развертывания выпуска Azure, чтобы сделать преобразования конфигурации специфичными для целевой среды.

Когда вы проверяете преобразование XML во время развертывания Azure, выполняется следующая последовательность:

  • Примените web.release.config к web.config
  • Примените web.stageName.config к измененному web.config.

Но web.release.config уже был применен к web.base.config, поэтому, если

compilation xdt:Transform="RemoveAttributes(debug)" 

используется в файле web.release.config, атрибут web.config уже был удален во время компиляции, и когда он развертывает его снова, преобразовать с помощью web.release.config, пытаясь применить указанную выше команду, но это не удается.

person Nicolas Cocu    schedule 14.08.2019

Достаточно удалить атрибут отладки RemoveAttributes (отладка). Он будет работать аналогично debug = false.

person user2211290    schedule 07.05.2018