2010-08-06 2 views
6

В команде, в которой я работаю, у нас есть большой продукт со многими веб-сервисами WCF и некоторыми веб-сайтами, которые используют эти сервисы. Мы как раз собираемся перейти на VS 2010, и я смотрю, если мы начнем использовать новые функции преобразования конфигурации в VS 2010.Как использовать конфигурацию Visual Studio 2010 при запуске/отладке локально?

У нас есть несколько различных сред, которым нужны разные web.configs (строки подключения базы данных, WCF адреса и т. д.). Часто при отладке чего-то высокого уровня, такого как веб-интерфейс, полезно настроить его для прямого подключения к базе данных TEST или QA. На локальном компьютере каждого разработчика IIS настраивается непосредственно в исходную папку каждого проекта WCF/web, и при запуске локально это просто вопрос Ctrl-Shift-B или F5 для отладки чего-то. Казалось бы, что можно построить/F5 с TEST или QA в качестве режима конфигурации и получить конфигурацию TEST/QA, но я не вижу, как это сделать. Разве это не поддерживается, или, может быть, нам нужно изменить то, как мы работаем с вещами?

Наш другой вариант - вместо этого использовать простой скрипт замены как событие предварительной сборки, которое создает файл web.config из шаблона и ключевого файла в зависимости от режима конфигурации. С помощью этого метода вы получите конфигурацию TEST, если вы скомпилируете TEST и т. Д., Но мне кажется, что это плохо, когда мы используем встроенную в Visual Studio функцию.

ответ

1

Вы можете добиться эффекта, который вы ищете, используя целевые объекты BeforeBuild и AfterBuild, доступные в файле .csproj. VS.NET IDE будет выполнять эти задачи при выполнении сборки или перестроить, поэтому вы можете использовать их для выполнения преобразований web.config. Поскольку вам нужно будет преобразовать web.config, а затем перезаписать фактический файл web.config, вам нужно будет использовать новый файл с именем web.default.config для хранения базовых данных web.config.

Я попробовал это в тестовом проекте, здесь были изменения, которые я сделал в файл .csproj:

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" /> 
<ProjectExtensions> 
... 
</ProjectExtensions> 
<Target Name="BeforeBuild"> 
    <Copy SourceFiles="$(ProjectDir)web.default.config" DestinationFiles="$(ProjectDir)web.config" /> 
</Target> 
<Target Name="AfterBuild" Condition="$(FirstRun) != 'false'"> 
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="TransformWebConfig" Properties="FirstRun=false;" /> 
    <Sleep Milliseconds="2000" /> 
    <Copy SourceFiles="$(ProjectDir)obj\$(ConfigurationName)\TransformWebConfig\transformed\web.config" 
     DestinationFiles="$(ProjectDir)web.config" /> 
</Target> 

мне пришлось вручную добавить их в файл .csproj (я использовал Notepad ++). Насколько я могу судить, нет способа добавить эти инструкции через ID.NET VS.NET. Вы должны предоставить условие на AfterBuild, чтобы он не имел круговой ссылки, поскольку вызов MSBuild перезапустит сборку для генерации преобразования web.config.

В основном мы делаем копирование файла web.default.config (нашего базового шаблона) поверх существующего web.config перед началом сборки, а затем мы используем MSBuild для генерации web.config для любой конфигурации мы строим. По завершении преобразования мы используем задачу «Копировать», чтобы перенести преобразованный файл и скопировать его в файл web.config в корневом каталоге веб-сайта. Одна из проблем, с которыми я иногда сталкивалась, - ошибка использования файла при попытке перезаписать файл web.config после завершения преобразования. Добавление задачи «Сон» (от MSBuildCommunityTasks) после того, как задача MSBuild позаботилась об этой проблеме.

Я только тестировал этот подход, используя встроенный сервер ASP.NET, а не IIS, поэтому YMMV, но я чувствую, что это приемлемое решение.

Идея FirstRun исходила из этого post.

+0

Ive отметил этот ответ как принятый, поскольку кажется, что он решает проблему (даже если я ее не тестировал). Благодарю. В итоге мы пошли с пользовательским событием postbuild, как я написал в последнем абзаце, маленьком сценарии powershell, который создает web.config из шаблона, который использует имя_настройки, чтобы решить, как заменить. – viblo

+0

@viblo Спасибо. Я не уверен, что буду использовать подход, который я изложил, поскольку это своего рода хакерство, но мне было любопытно, что это можно сделать или нет. В любом случае, хороший вопрос. – rsbarro

+0

@rsbarro в первую очередь спасибо за ваш чистый ответ. Тем не менее, Im по-прежнему имеет ту же проблему «ошибка использования файла».Даже я добавил . Есть ли у вас какие-либо другие предложения? Спасибо – curiousBoy

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