-->

пятница, 3 июля 2015 г.

Преобразования конфигурационных файлов. Новая схема



Трюк из моего старого поста, позволяющий трансформировать Web.config при локальной сборке проекта в зависимости от выбранной конфигурации - активно используется на текущем проекте и уже сэкономил команде многие часы работы. Мы используем 5+ конфигураций (Debug, Test, Release, PreRelease и т.п.) для удобного переключения в 5 точках входа между десятком внешних сервисов, 5-6 версиями одной БД, различными оптимизационными настройками и т.п.

Можно ли эту схему упростить еще больше? В некоторых случаях - да, можно.


На днях было придумано вот что: держать в проекте не один базовый конфигурационный файл, а 2: для отладки и продакшена соответственно, как показано на открывающем пост рисунке. Это обусловлено тем, что все наши конфигурации можно разделить на 2 группы: отладочные и боевые, и в пределах одной группы многие параметры полностью совпадают, поэтому их можно вынести в базовый файл, тем самым еще больше упростив файлы трансформации (App.Debug.config и т.д.).

При этом я предлагаю следовать таким соглашениям:
  • App.Dev.config - полноценный конфигурационный файл для отладки приложения, применения XML-трансформаций к нему не предусмотрено;
  • Соответственно, в App.Debug.config - пусто (что отмечено на рисунке);
  • Если для тестирования нужна другая БД, в App.Test.config переопределяем нужный параметр, и т.п. 
Для App.Production.config рассуждения аналогичны. В итоге, файлы трансформации содержат только отличия от полностью работоспособного конфигурационного файла, а не абстрактного Base.config.

А реализовать это достаточно просто. Для App.config нам необходимо вручную создать и добавить файлы трансформации (здесь и далее редактируем файл проекта *.csproj):

<None Include="App.Debug.config">
 <DependentUpon>App.config</DependentUpon>
</None>
Затем добавить уже знакомое нам указание трасформировать конфиг перед сборкой, выбрав необходимые конфигурации в атрибуте Condition:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\WebApplications\Microsoft.WebApplication.targets" />
<Target Name="BeforeBuild">
 <TransformXml
  Condition="'$(Configuration)' == 'Debug' 
          OR '$(Configuration)' == 'Test'"
  Source="App.Dev.config"
  Transform="App.$(Configuration).config"
  Destination="App.config" />
</Target>
И вновь, рассказывать дольше, чем делать!
Полноценный пример на Github, завел там новый аккаунт по имени-фамилии, ура!

Комментариев нет:

Отправить комментарий