Setty.org
Предисловие
Я думаю, что каждый .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 разработчику.
Недостатки
Так как при использовании 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. Данный проект используется у нас в компании на протяжении нескольких лет и довольно успешно.