Управления конфигурационными файлами в .net проектах

в 14:53, , рубрики: .net, .net development, ASP, configuration management, web.config, Веб-разработка, метки: , ,

Предисловие

Я думаю, что каждый .net разработчик хоть раз, да сталкивался с проблемами управления конфигами для различных окружений. Часто есть необходимость при разработке новой функциональной возможности поменять строку подключения к БД, не мешая при этом другим разработчикам. Для этого обычно в конфиге меняется строка подключения на локальную базу данных, а потом эти изменения комитятся… Все остальные разработчики негодуют, потому что система перестала работать на их локальных машинах.
Если команда распределённая часто есть необходимость в спецефических настройках. Иногда вам нужны одинаковые настройки для разных проектов в солюшене и вы просто копируете их. В конце концов хотелось бы иметь возможность добавлять различную логику в конфиг. К примеру, на локальных машинах разработчиков отправленная почта должна сохранятся на диске, в то время как на тестовом сервере почта должна отправлятся с использованием сервиса отправки почты. Я думаю можно привести много примеров, которые сложно реализуемы без дополнительного механизма управления конфигами.

Введение

Описанные в предисловии недостатки привели к созданию маленького OSS проекта с названием Setty. Setty генерирует *.config файлы с использованием различных 'языков трансформации". Первая версия проекта использовала xslt для генерации конфигов, и многие новые разработчики, которые приходили в нашу компанию, с опасением смотрели на этот проект, несмотря на многие его преимущества. Поэтому немногим позже мы добавили ещё один, хорошо известный в мире .net 'язык трансформации' — razor, и возможность расширять проект любым 'языком трансформации' без особых проблем.

Установка и использование

Самый простой способ установки — через плагин для visual studio 2010. Но мы пойдём более тернистым путём и сделаем всё своими руками (razor + .net 4).

  • Создайте проект в visual studio (я создал asp.net mvc 3 проект)
  • Скопируйте web.config и добавьте к нему расширение .cshtml.
    <configuration>
      <appSettings>
        <add key="MyFirstSetting" value="@Model["hello"]" />
        ...
    

    Model["hello"] — это пример того, как читить настройки с помощью razor.

  • Скачайте исполняемый файл setty.exe отсюда и положите его рядом с .sln файлом.
  • Создайте папку где будут храниться ваши ключ/значение настройки (обычно она находится на уровень выше папки с проектом). Создайте там App.config файл с appSetting секцией, которая и будет являтся источником настроек:
    <configuration>
      <appSettings>
        <add key="hello" value="Hello World"/>
      </appSettings>
    </configuration>
    

  • Рядом с .sln создайте специальный файл .setty, который нужен для того что бы исполняемый файл знал путь к настройкам. .setty — содердит либо абсолютный, либо относительный путь к настройкам.
  • Выгрузите проект для того чтобы модифицировать *.csproj файл и добавьте в корневой элемент следующий xml:
    <Target Name="Setty" BeforeTargets="PreBuildEvent">
        <Exec Command=""$(MSBuildProjectDirectory)..setty.exe" /silent" />
    </Target>
    

    Это нужно для того, чтобы перед каждым билдом setty перегенерировал конфигурационные файлы.

  • Загрузите проект и перебилдите его, после чего ваш web.config файл будет выглядеть следующим образом:
    <configuration>
      <appSettings>
        <add key="MyFirstSetting" value="Hello World" />
        ...
    

В реальны проектах папка с настройками может выглядеть вот так:
Управления конфигурационными файлами в .net проектах
Я полагаю, что иерархическая система чтения настроек понятна каждому .net разработчику.

Недостатки

Так как при использовании Setty ваши *.config файлы генерируются перед каждым билдом, то изменения добавленые в конфиг с помощью NuGet могут быть потеряны. Т.е. разработчики должны сами копировать эти изменения в *.config.cshtml файлы.
В *.config.cshtml теряется привычная подсветка для *.config файлов в .net.

Дополнительная информациия

1. Сайт проекта с более подробной документацией — setty.org
2. Код проекта и место для обсуждений на github — Setty source code
3. Плагин для visual studio 2010 — VS 2010 plugin

P.S. Данный проект используется у нас в компании на протяжении нескольких лет и довольно успешно.

Автор: AndrewOrsich

* - обязательные к заполнению поля