2010-10-13 2 views
136

Можно создать дубликат:
How can I use Web.debug.config in the built-in visual studio debugger server?Использование Visual Studio web.config преобразования для отладки

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

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

Любая идея?

+13

Этот вопрос * не * дубликат. Связанный «дубликат» http://stackoverflow.com/questions/3305096/how-can-i-use-web-debug-config-in-the-built-in-visual-studio-debugger-server относится к конкретному версии Visual Studio. Этот вопрос не делает, и, на мой взгляд, этот вопрос имеет более полезные ответы в любом случае. –

ответ

17

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

+0

Если есть причина, по которой вы не можете сделать то, что предлагает мой ответ, это лучший вариант, который я думаю. Я думаю, что задачи до и после сборки иногда игнорируются! –

+0

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

+1

Связанная статья: https://gist.github.com/EdCharbeneau/9135216 – Suamere

28

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

+39

Это не всегда хорошо работает в средах с несколькими разработчиками (например, думаю, строка соединения). –

+3

V. Подобно точке Бена ... как насчет множества сред разработки, я использую три разных компьютера Dev, для тестирования разных браузеров и т. Д., Постоянно нужно менять различные конфигурации, чтобы настроить разные эти разные настройки. – MemeDeveloper

+4

Иногда мне нужно отлаживать нашу интеграцию или промежуточную базу данных, а не обычную базу данных разработки. Было бы очень полезно, чтобы соответствующее преобразование применялось при запуске отладчика VS. – Zarepheth

13

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

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

+4

что такое синтаксис события post build, чтобы преобразовать веб-страницы конфиг? – Cutter

+0

Вы должны использовать команды, например, для копирования отдельного файла; один способ для отладки/теста и другой способ для производства (чтобы убедиться, что ваша публикация не получает информацию о тестировании). –

+0

Согласен. При отладке облачного проекта конфигурация работает именно так. Было бы хорошо с некоторой согласованностью, например config-transform для библиотек классов и т. Д. –

31

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

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

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

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

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

+4

Переключение между режимами Release и Debug всегда оказывало влияние на запуск приложения локально. Если вы 1) для преобразования, являющегося исключением из правила, делает этот счетчик интуитивным, – AaronLS

+11

Что вы говорите правильно, но, на мой взгляд, дизайн этой функции является предельным. стандартизованный web.config для всех разработчиков, во всех средах, в любой группе может быть невозможен (ни для чего, кроме простейших случаев). Отсутствие поддержки этой функции для локальных сборок - большой позор на мой взгляд. – MemeDeveloper

+3

Кроме того, почему возникает проблема с деструктивным характером преобразований ... web.config и преобразования должны быть в SC. Каждая среда, нуждающаяся в другой конфигурации, должна иметь собственное преобразование, например. web.config, web.devgroup1.config, web.devgroup2.config, web.staging.config web.production.config и т. д. Так что, хотя web.config изменится, ничего не будет потеряно, получить последнюю + сборку приведет к правильному web.config для этой среды, ничего не потеряно. – MemeDeveloper

86

ОК, при том понимании, что 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, потому что они уже имеют четко определенную роль в издательском Pipeline Web, поэтому мы не хотим нарушать это. Поэтому вместо этого мы создадим два новых файла в той же папке, что и проект, и web.template.config, web.dev.debug.config и web.dev.release.config.

Идея заключается в том, что это будут преобразования, применяемые при отладке или запуске приложения из Visual Studio. Теперь нам нужно подключиться к процессу сборки/пакета/публикации, чтобы все это подключалось. В проектах веб-приложений (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, поэтому вам, возможно, придется настраивать в зависимости от того, что у вас есть в этом файле. Вопросы/комментарии?

+0

Я следил за инструкциями здесь, но он, похоже, не работает, если я не скопирую точный конфиг, который мне нужен (без преобразования материала) в файл web.template.config. Любые идеи, почему это происходит (или как проверить, какой из моих файлов config.Web.dev. *. Config используется для преобразования? –

+1

Майк, у меня была такая же проблема. Однако, когда я удалил

+0

Я пробовал использовать это, как описано, но он все еще не работает. Невероятно, что мы используем это в других проектах, и это работает без проблем. этот вопрос стека http://stackoverflow.com/questions/11763841/web-config-transform-from-web-template-xml-not-working, если кто-то хочет прослушивать. – Jerry

Смежные вопросы