Подтвердить что ты не робот

Управление сложными файлами Web.Config между средами развертывания

Кто-нибудь знает какие-либо хорошие инструменты/утилиты для управления файлами Web.Config между разными средами сборки/развертывания?

Например, у меня есть проект WCF, который в разработке я не хочу включать SSL, но я хочу, чтобы он был включен в производство. Я хочу разные настройки ведения журнала, различные строки подключения к БД, различные обработки ошибок, разные пути к файлам... Даже некоторые разные привязки фреймов Unity (подключайте mocks для модульного тестирования вместо реальных объектов для развертывания).

Поддержание отдельных копий Web.Config - это боль, потому что добавление новой веб-службы означает редактирование нескольких файлов и синхронизацию их.

Я также заметил, что если вы слишком сильно обманываете Web.Config вручную, Visual Studio задохнется, если вы попытаетесь использовать мастер "добавить элемент", чтобы, скажем, добавить новую веб-службу для WCF, поскольку он должен изменить Web.Config, чтобы добавить конечную точку, и он больше не может ее разобрать. Поэтому я должен быть осторожным, чтобы не аннулировать существующий Web.Config.

Я также подумал о том, чтобы просто использовать некоторое регулярное выражение для замены и просто создать новый Web.Config в команде pre-build. Это кажется лучшим вариантом до сих пор...

Любые другие идеи? Похоже, что это должна быть очень распространенная проблема, так как Web.Config, вероятно, никогда не будет одинаковой между развертываниями разработки и производства.


Update:

Я решил написать быстрое консольное приложение, которое будет принимать все xml файлы в заданном каталоге и объединить их в один, и включать только определенные файлы на основе имени.

Поэтому я могу сделать в каталоге:

WebConfig_All

<configuration>
  <configSections>
    ...
  </configSections>
  <system.web>
    ...
  </system.web>
</configuration>

connectionStrings_Debug

<configuration>
  <connectionStrings>
    <add name="connstr" connectionString="...dev..." />
  </connectionStrings>
</configuration>

connectionStrings_Release

<configuration>
  <connectionStrings>
    <add name="connstr" connectionString="...prod..." />
  </connectionStrings>
</configuration>

Затем запустите мой инструмент командной строки и передайте конфигурацию (Debug, Release, custom...) И он объединит все файлы, которые заканчиваются на _All" or _ <configuration> `.

Итак, теперь у меня есть 80% моего Web.Config в одном файле WebConfig_All и 20% пользовательских материалов в отдельных файлах для каждой конфигурации сборки. Затем я могу запустить инструмент командной строки в качестве задачи предварительной сборки в VisualStudio или из NAnt или где бы я ни хотел...

Я также сделал свою логику слияния XML достаточно хорошей, чтобы обрабатывать такие вещи, как:

<x>
  <y a="1">
    <z a="1"/>
  </y>
</x>

сливается с

<x>
  <y a="1">
    <z a="2"/>
  </y>
  <y a="2"/>
</x>

приводит к:

<x>
  <y a="1">
    <z a="1"/>
    <z a="2"/>
  </y>
  <y a="2"/>
</x>

Хорошо выглядит до сих пор...:)


Followup:

Этот вопрос немного старенький, поэтому я хотел указать, что VisualStudio 2010 имеет функцию для преобразования web.config: http://msdn.microsoft.com/en-us/vstudio/Video/ff801895

Конечно, в типичной моде Microsoft, реализующей только 50% возможностей, она работает только для веб-проектов с использованием веб-развертывания. Существует плагин для преобразования преобразований в другие проекты, расположенные здесь: http://www.hanselman.com/blog/SlowCheetahWebconfigTransformationSyntaxNowGeneralizedForAnyXMLConfigurationFile.aspx

Вы также можете использовать инструмент BuildMaster для управления конфигурационными файлами (вместе со строками, тестами, сценариями БД и т.д.). )

4b9b3361

Ответ 1

Мы разделили все настройки, относящиеся к региону, в собственный конфигурационный файл. Под корнем веб-приложения мы создаем папку config и размещаем там специфические для региона настройки. Таким образом, любые файлы, живущие под корнем config, получат.

наш web.config выглядит примерно так:

.
.
.
<appSettings configSource="config\appSettings.config"/>
<nlog configSource="config\nlog.config"/>
<applicationSettings>
    <MyApp.UI.Properties.Settings configSource="config\Settings.APGUI.config"/>
    <MyApp.BusinessServices.Properties.Settings configSource="config\Settings.Business.config"/>
    <MyApp.Auditing.Properties.Settings configSource="config\Settings.Auditing.config"/>
</applicationSettings>
.
.
.

Итак, если мы развертываем в область релиза, в инструменте сборки будет просто действие, чтобы заменить файлы в корневой директории файлами из соответствующей папки региона. Структура файла выглядит примерно так:

ADDED: так выглядит структура управления версиями, развернутое приложение просто имеет конфигурационный каталог без подпапок или курса

\Root
   web.config    
   \Config    
       appsettings.config    
       services.config    
       logging.config    
       \release    
          appsettings.config    
          services.config    
          logging.config    
       \debug
          appsettings.config    
          services.config    
          logging.config

Он довольно чистый и поддерживается любым автоматическим инструментом сборки (копирование/замена файлов). Приятным побочным эффектом является то, что разработчики могут создавать разные вкусы и поддерживать их под контролем источника, не затрагивая "настоящие" конфиги.

Ответ 2

Вы можете использовать Build Events для управления вашими веб-конфигурациями. Hanselman содержит хорошую статью об этом.

В основном у вас есть все ваши различные web.configs в решении, которое вы создаете (некоторые) новые типы сборки. В зависимости от типа сборки, которую вы запускаете, web.config копируется по ссылке.

Ответ 3

Вам нужна задача XmlMassUpdate в MSBuildCommunityTasks (делает то, что вы пытаетесь сделать с консольным приложением xml)

http://msbuildtasks.tigris.org/

используйте его так

  <XmlMassUpdate Condition=" '@(ConfigTemplateFile)'!='' And '@(ConfigSubstitutionsFile)'!=''"
    ContentFile="@(ConfigTemplateFile)"
    SubstitutionsFile="@(ConfigSubstitutionsFile)"
    MergedFile="@(ConfigFile)"
    ContentRoot="/configuration"
    SubstitutionsRoot="/configuration/substitutions/$(Configuration)"/>

Ответ 4

Я использую метод объясненный Scott Hanselman (он объясняет это намного лучше, чем я могу воспроизвести это, следуя ссылке:)) Он отлично справился со мной...

Ответ 5

Я использую этот инструмент: xmlpreprocess

мы сохраняем отдельные файлы свойств для каждой среды, которые объединены при развертывании script.

Ответ 6

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

Ответ 7

Мы используем теги в наших конфигурационных файлах, которые заменяются во время сборки, чтобы отразить предполагаемую среду развертывания. Я был вдохновлен Блог Lavablast

Приятно иметь только один управляющий файл шаблонов.

Недостатком является то, что вы не можете легко создавать пользовательские "разделы".

Ответ 8

Старый вопрос, но поскольку он имеет высокий рейтинг в поиске Google, я подумал, что неплохо добавить синтаксис преобразования web.config, что был доступен с VS2010. С помощью этого инструмента вы можете иметь разные файлы web.config для разных сборников (Debug/Release)

Вот краткое резюме о том, как иметь две строки соединений: один для разработки (режим отладки) и один для производства (режим выпуска):

1- Установите строку соединения разработки в файле web.config. Должно выглядеть примерно так:

 <connectionStrings>
    <add name="myConnectionString"  connectionString="Data Source=TestDBServer; (etc...)" />
  </connectionStrings>

2- Разверните файл web.config и откройте web.release.config

web.config

3 Используйте Replace функцию, чтобы заменить строку соединения той, которую вы хотите для производства. Вы можете использовать атрибут xdt:Locator="Match(name)", чтобы сопоставить его с именем строки подключения (myConnectionString) в этом примере:

<connectionStrings>
    <add name="myConnectionString"  xdt:Transform="Replace" xdt:Locator="Match(name)" 
         connectionString="Data Source=ProdDBServer; (etc...)" />
  </connectionStrings>

4- Предварительный просмотр файла web.config, который будет использоваться во время сборки выпуска, щелкнув правой кнопкой мыши файл web.release.config и выбрав Preview Transform.

введите описание изображения здесь

Ответ 9

Я традиционно использовал несколько web.configs, как вы упомянули. Это может быть боль, но она смягчается инструментами сравнения файлов, такими как BeyoneComapare2 или KDIff...

Ответ 10

Раздражение:

Я упомянул мое маленькое приложение cmd для объединения XML-документов в моем первом обновлении... Ну, чтобы сделать это, я просто использую XmlDocument и в конечном итоге просто .Save() он в FileStream.

К сожалению, узлы не находятся в определенном порядке, и, по-видимому,.NET требует <configSections> элемент будет первым дочерним элементом документа.

Я думал, что все эти причудливые инструменты должны облегчить жизнь программирования?

Ответ 11

Мои любимые два способа борьбы с этим:

а. Сохраняйте настройки на целевом компьютере. * В Azure, например, вы можете настроить параметры приложения и строки подключения, которые переопределяют значения в web.config. (* - или определение целевой машины, если конфигурация вашей инфраструктуры динамична).

В. Создайте средство сборки/развертывания (TeamCity, Octopus Deploy и т.д., VS Team Services), введя значения среды, связанные с построением и/или развертыванием. Современные инструменты поддерживают шифрование чувствительных настроек.