Использовать преобразование 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, по моему мнению, является более полным ответом.