- PVSM.RU - https://www.pvsm.ru -

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

Предисловие

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

Введение

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

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

Самый простой способ установки — через плагин [1] для 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 отсюда [2] и положите его рядом с .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 [3]
2. Код проекта и место для обсуждений на github — Setty source code [4]
3. Плагин для visual studio 2010 — VS 2010 plugin [5]

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

Автор: AndrewOrsich


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/net/11886

Ссылки в тексте:

[1] плагин: https://github.com/downloads/paralect/setty/Setty.VsAddin.vsix

[2] отсюда : https://github.com/downloads/paralect/setty/Setty.exe

[3] setty.org: http://setty.org/

[4] Setty source code: https://github.com/paralect/setty

[5] VS 2010 plugin: http://visualstudiogallery.msdn.microsoft.com/7df151ca-5c29-49af-aa67-bbc04e0311a9