Как добавить конфигурационные преобразования для настраиваемого файла конфигурации в Visual Studio?

Проект, над которым я работаю, включает в себя чтение большого количества конечных точек обслуживания (url) из файла конфигурации. Поскольку список будет довольно большим, я решил сохранить их в пользовательском файле конфигурации, чтобы мой web.config был чистым и небольшим. Я включил пользовательский раздел в свой веб-сайт, как показано ниже:

<mySection configSource="myConfig.config" />

Я отлично работаю.

Но проблема преобразования возникает при развертывании проекта в разных средах. У меня есть три файла web.config:

Web.config

Web.Uat.config

Web.Release.config

В то время как преобразование web.config работает, преобразования для настраиваемых файлов конфигурации не выполняются при развертывании.

Есть ли способ преобразовать пользовательский файл конфигурации во время развертывания?

Ответ 1

Visual Studio по умолчанию преобразует только файлы web.config.

Если вам нужен настраиваемый файл конфигурации с преобразованием для сред DEV, UAT, PROD и т.д., Тогда попробуйте

  1. Используйте настраиваемые расширения для Visual Studio, такие как SlowCheetah - XML Transforms for Config для предварительного просмотра конфигурации.
  2. Добавьте для проекта от Nuget SlowCheetah, чтобы обеспечить трансформацию.

Немного деталей:

Добавить VS Extension SlowCheetah из расширений и обновлений Screen of Extensions and Updates

Щелкните правой кнопкой мыши на myconfig.config и выберите add transorm: Screen of Extensions and Updates

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

<services xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <service name="WebApplication1.Services.Service2" xdt:Transform="Replace" xdt:Locator="Match(name)" >
    <endpoint address="http://localhost:57939/Services/DebugService" behaviorConfiguration="WebApplication1.Services.Service2AspNetAjaxBehavior"
      binding="webHttpBinding" contract="WebApplication1.Services.Service2" />
  </service>
</services>

Надеюсь, это было полезно

Ответ 2

Я собираюсь продлить на Андони Риполл Джарауту немного ответ.

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

... достаточно просто. Создайте собственный файл конфигурации, webdb.config и обновите файл web.config.

Ex. web.config

<connectionStrings configSource="WebDB.config"/>

Для трансформации требуется wedbdb.config(xml version = "1.0")

<?xml version="1.0" encoding="utf-8"?>
<connectionStrings>
</connectionStrings>

Затем добавьте файлы преобразования для webdb.config

enter image description here

Пример WebDB.Debug.config:

<?xml version="1.0" encoding="utf-8"?>

<connectionStrings xdt:Transform="Replace" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <add name="PRRADDataContainer" connectionString="metadata=~/PRRADData.csdl|~/PRRADData.ssdl|~/PRRADData.msl;provider=System.Data.SqlClient;provider connection string=';Data Source=localhost;Initial Catalog=;User ID=;Password=;multipleactiveresultsets=True;App=EntityFramework';" providerName="System.Data.EntityClient" />
    <add name="MyConnectionString" connectionString="Data Source=localhost;Initial Catalog=;Persist Security Info=True;User ID=;Password=;" providerName="System.Data.SqlClient" />
</connectionStrings>

Пример WebDB.Release.config:

<?xml version="1.0" encoding="utf-8"?>

<connectionStrings xdt:Transform="Replace" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <add name="PRRADDataContainer" connectionString="metadata=~/PRRADData.csdl|~/PRRADData.ssdl|~/PRRADData.msl;provider=System.Data.SqlClient;provider connection string=';Data Source=prod_server;Initial Catalog=;User ID=;Password=;multipleactiveresultsets=True;App=EntityFramework';" providerName="System.Data.EntityClient" />
    <add name="MyConnectionString" connectionString="Data Source=prod_server;Initial Catalog=;Persist Security Info=True;User ID=;Password=;" providerName="System.Data.SqlClient" />
</connectionStrings>

Затем нам нужно добавить событие после сборки. Это создается путем простого редактирования файла CSPROJ.

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterBuild">
    <TransformXml Source="WebDB.config" Transform="WebDB.$(Configuration).config" Destination="WebDB.config" />
</Target>

Теперь, когда я запускаю локально, я получаю WebDB.Debug.config, и когда я публикую свой код, мне просто нужно убедиться, что вы выбрали "Release" в качестве источника конфигурации. В обоих случаях файл WebDB.config будет обновляться соответствующим файлом при его создании.

ПРИМЕЧАНИЕ. Обязательно установите для webdb.config, webdb.debug.config и webdb.release.config значение "Не копировать" для параметра "Копировать в выходной каталог".

Надеюсь это поможет!

Ответ 3

Я использую SlowCheetah, но нашел что-то, что я считаю более элегантным. Просто сообщая сборке для создания.config в зависимости от конфигурации сборки.

Имея app.Release.config в вашем проекте (или многое другое в зависимости от ваших потребностей развертывания), вам просто нужно отредактировать файл проекта (файл.csproj, если вы программируете на С#). Найдите его конец, между последними </ItemGroup> и </Project> и добавьте:

  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="AfterBuild">
    <PropertyGroup>
      <OutputTypeName>$(OutputType)</OutputTypeName>
      <OutputTypeName Condition="'$(OutputTypeName)'=='Library'">dll</OutputTypeName>
      <OutputTypeName Condition="'$(OutputTypeName)'=='Module'">dll</OutputTypeName>
      <OutputTypeName Condition="'$(OutputTypeName)'=='Winexe'">exe</OutputTypeName>
    </PropertyGroup>
    <TransformXml Source="Config\app.config" Transform="Config\app.$(Configuration).config" Destination="$(OutputPath)\$(AssemblyName).$(OutputTypeName).config" />
  </Target>
</Project>

Сохраните и перезагрузите из VisualStudio. Скомпилируйте в режиме Release и проверьте папку bin/Release в файле <MyProject>.config это преобразование завершено.

Этот пример относится к файлам Exe и Dll и любой версии VisualStudio, потому что включает эту помощь для справки