Как добавить конфигурационные преобразования для настраиваемого файла конфигурации в 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 и т.д., Тогда попробуйте
- Используйте настраиваемые расширения для Visual Studio, такие как SlowCheetah - XML Transforms for Config для предварительного просмотра конфигурации.
- Добавьте для проекта от 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, потому что включает эту помощь для справки