Использовать преобразование Visual Studio web.config для отладки

Возможный дубликат:
Как я могу использовать Web.debug.config на встроенном сервере отладчика visual studio?

Я хочу использовать преобразование Web.config, которое отлично работает как для публикации, так и для отладки.

Когда я публикую веб-приложение, Visual Studio автоматически преобразует файл Web.config на основе моей конфигурации currentctbuild. Как я могу сказать Visual Studio сделать то же самое, когда я начинаю отладку? При запуске отладки он просто использует стандартный Web.config без преобразования.

Любая идея?

5 ответов

Хорошо, с пониманием того, что web.debug.config & web.release.config только для упаковки / публикации. Я придумал способ, позволяющий сделать то, что вы пытаетесь сделать. Я писал об этом в http://sedodream.com/2010/10/21/ASPNETWebProjectsWebdebugconfigWebreleaseconfig.aspx. Вот резюме.

Теперь давайте посмотрим, как мы можем включить то, что хочет сделать задающий вопрос.

Напомним, что когда он опирается на конкретную конфигурацию, он хочет применить конкретное преобразование к web.config, Итак, очевидно, что вы не хотите поддерживать web.config файл, потому что он будет перезаписан.

Итак, что нам нужно сделать, это создать новый файл web.template.config, который является просто копией web.config, Тогда просто удали web.config с помощью проводника Windows (не удаляйте с помощью Visual Studio, потому что мы не хотим удалять его из проекта).

Примечание. Если вы используете поставщика управления исходным кодом, который интегрирован в Visual Studio, вы, вероятно, захотите удалить файл web.config из управления исходным кодом.

Также с этим мы не хотим использовать web.debug.config или же web.release.config потому что они уже имеют четко определенную роль в конвейере веб-публикаций, поэтому мы не хотим мешать этому. Вместо этого мы создадим два новых файла в той же папке, что и проект, и web.template.config, web.dev.debug.config а также web.dev.release.config,

Идея заключается в том, что это будут преобразования, применяемые при отладке или запуске приложения из Visual Studio. Теперь нам нужно подключиться к процессу build / package / publish, чтобы все это было связано. В проектах веб-приложений (WAP) существует точка расширяемости, с помощью которой вы можете создать файл проекта в той же папке с именем {ProjectName}.wpp.targets где {ProjectName} это название проекта. Если этот файл находится на диске в той же папке, что и WAP, он будет автоматически импортирован в файл проекта. Итак, я создал этот файл. И я разместил следующий контент:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <!-- Make sure web.config will be there even for package/publish -->
  <Target Name="CopyWebTemplateConfig" BeforeTargets="Build">
    <Copy SourceFiles="web.template.config"
          DestinationFiles="web.config"/>
  </Target>

  <PropertyGroup>
    <PrepareForRunDependsOn>
      $(PrepareForRunDependsOn);
      UpdateWebConfigBeforeRun;
    </PrepareForRunDependsOn>
  </PropertyGroup>

  <!-- This target will run right before you run your app in Visual Studio -->
  <Target Name="UpdateWebConfigBeforeRun">
    <Message Text="Configuration: $(Configuration): web.dev.$(Configuration).config"/>
    <TransformXml Source="web.template.config"
              Transform="web.dev.$(Configuration).config"
              Destination="web.config" />
  </Target>

  <!-- Exclude the config template files from the created package -->
  <Target Name="ExcludeCustomConfigTransformFiles" BeforeTargets="ExcludeFilesFromPackage">
    <ItemGroup>
      <ExcludeFromPackageFiles Include="web.template.config;web.dev.*.config"/>
    </ItemGroup>
    <Message Text="ExcludeFromPackageFiles: @(ExcludeFromPackageFiles)" Importance="high"/>
  </Target>
</Project>

Позвольте мне объяснить это немного. Я создал цель CopyWebTemplateConfig, которая всегда будет копировать web.template.config в web.config на сборке, даже если вы не отлаживаете свое приложение в Visual Studio.

Это необходимо, потому что мы все еще должны поддерживать процесс упаковки / публикации в Visual Studio. Затем я продлил собственность PrepareForRunDependsOn включить UpdateWebConfigBeforeRun цель. Это свойство используется для определения списка целей, которые необходимо выполнить до запуска любого управляемого проекта из Visual Studio.

В этой цели я использую TransformXml задача преобразовать web.template.config, используя правильный web.dev.***.config файл. После этого ваше приложение запускается с использованием правильного web.config на основе вашей конфигурации сборки. После этого у меня есть другая цель ExcludeCustomConfigTransformsFiles, который я внедряю в процесс упаковки / публикации через атрибут BeforeTargets=”ExcludeFilesFromPackage”, Это необходимо, потому что мы не хотим, чтобы эти файлы были включены, когда приложение упаковано или опубликовано. Так что это действительно все, что нужно сделать.

Чтобы объяснить процесс упаковки / публикации немного больше для этого сценария. Когда вы упаковываете / публикуете web.debug.config или же web.release.configв зависимости от конфигурации сборки все равно будет использоваться. Но в конечном итоге файл, который он преобразует, web.template.config, так что вам, возможно, придется настроить в зависимости от того, что у вас есть в этом файле. Вопросы / комментарии?

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

web.config Это конфигурационный файл, который разработчики должны использовать локально. В идеале вы должны сделать это стандартизированным. Например, вы можете использовать localhost для строк БД, а что нет. Вы должны стремиться к тому, чтобы это работало на машинах разработчиков без изменений.

web.debug.config Это преобразование, которое применяется при публикации приложения в промежуточной среде разработки. Это внесет изменения в файл web.config, необходимые для целевой среды.

web.release.config Это преобразование, которое применяется при публикации приложения в "производственной" среде. Очевидно, вы должны быть осторожны с паролями в зависимости от вашего приложения / команды.

Проблема с преобразованием web.config, который вы в данный момент выполняете, заключается в том, что преобразование может выполнять разрушительные действия для web.config. Например, он может удалять атрибуты, удалять элементы и т. Д.

Вы можете просто использовать "default" web.config в качестве вашей версии для разработки / отладки, и тогда, конечно, web.release.config останется релизной версией, поскольку ее преобразования применяются при публикации.

В конфигурации отладки добавьте шаг после сборки и используйте его для замены / преобразования web.config

Хотя я согласен с тем, что самый простой подход, как правило, является лучшим, я легко могу представить себе ситуацию, когда в течение некоторого периода времени вы хотите подключить свою IDE к тестовой базе данных вместо базы данных разработки. Хотя вы можете указать строки подключения для разработки в своем файле web.config по умолчанию, было бы очень неплохо иметь файл Web.Test.config, чтобы при переключении конфигурации сборки на "Тест" вы автоматически получали новые настройки пока еще в вашей IDE.

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

Другие вопросы по тегам