如何在Visual Studio中为自定义配置文件添加配置转换?

Tej*_*oft 20 c# asp.net transformation visual-studio webdeploy

我正在处理的项目涉及从配置文件中读取许多服务端点(url).由于列表非常大,我决定将它们保存在自定义配置文件中,以保持web.config干净小巧.我将自定义部分包含在我的网站中,如下所示:

<mySection configSource="myConfig.config" />
Run Code Online (Sandbox Code Playgroud)

我工作得很好.

但是在将项目部署到不同环境期间出现了转换问题.我有三个web.config文件:

Web.config文件

Web.Uat.config

Web.Release.config

转换web.config工作时,自定义配置文件的转换在部署时失败.

有没有办法在部署期间转换自定义配置文件?

Mic*_*ael 18

默认情况下,Visual Studio仅转换web.config文件.

如果您需要为DEV,UAT,PROD等环境进行转换的自定义配置文件,请尝试

  1. 使用Visual Studio的自定义扩展,如SlowCheetah -用于配置转换预览功能的XML转换.
  2. 从Nuget SlowCheetah添加项目以提供构建转换.

一点点细节:

从扩展和更新中添加VS Extension SlowCheetah 扩展和更新的屏幕

右键单击myconfig.config并选择add transorm: 扩展和更新的屏幕

在每个定义的配置内插入您自己的转换规则:

<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>
Run Code Online (Sandbox Code Playgroud)

希望它有所帮助

  • 它解决了问题,但我必须将其添加为nuget程序包。VS扩展能够显示“预览转换”,但在发布时尚未转换。 (2认同)

Ali*_*son 6

还有另一种不需要安装扩展或使用构建事件的方法。

假设您有这样的自定义配置:

  • 配置文件
  • 配置文件
  • myConfig.Release.config

然后在你的主要Web.config你有这个:

<mySection configSource="myConfig.config" />
Run Code Online (Sandbox Code Playgroud)

最后,在您的内部Web.Uat.config添加这样的转换:

<mySection configSource="myConfig.Uat.config" xdt:Transform="SetAttributes" />
Run Code Online (Sandbox Code Playgroud)

这不是转换myConfig.config文件,而是覆盖应该使用的自定义配置文件的名称。您可以对Release和任何其他环境执行相同的操作。

myConfig.Uat.config不应该包含转换,它应该是基本自定义配置文件的副本,具有自定义环境的适当值。

缺点是每次向基本自定义配置文件添加内容时,您还需要为其他 envs 添加到配置文件中(即使通过 envs 的值应该相同)。因此,我会考虑仅将这些自定义配置文件用于应在 envs 之间更改的设置。


And*_*uta 5

我一直在使用 SlowCheetah,但我发现了一些我认为更优雅的东西。只是告诉构建根据构建配置生成 .config 。

在您的项目中有一个 app.Release.config(或更多,取决于您的部署需要),您只需要编辑项目文件(如果您使用 C# 编程,则为 .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>
Run Code Online (Sandbox Code Playgroud)

保存并从 VisualStudio 重新加载。在发布模式下编译并检查<MyProject>.config转换完成的文件上的 bin/Release 文件夹。

此示例适用于 Exe 和 Dll 文件以及任何 VisualStudio 版本,因为包含此帖子帮助


spy*_*329 5

我将稍微介绍一下Andoni Ripoll Jarauta的答案。

我们面临着类似的问题。我想将连接字符串从web.config文件中拉出以限制合并冲突。我还想在发布时创建一个包含静态信息的“发布”配置。

...足够简单 创建一个自定义配置文件webdb.config,并更新web.config文件。

例如 web.config

<connectionStrings configSource="WebDB.config"/>
Run Code Online (Sandbox Code Playgroud)

wedbdb.config(转换需要xml version =“ 1.0”)

<?xml version="1.0" encoding="utf-8"?>
<connectionStrings>
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)

接下来添加webdb.config的转换文件

在此处输入图片说明

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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

接下来,我们需要添加一个构建后事件。这是通过简单地编辑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>
Run Code Online (Sandbox Code Playgroud)

现在,当我在本地运行时,我将获得WebDB.Debug.config,并且在发布代码时,只需确保选择“ Release”作为配置源。在这两种情况下,构建时都会使用相应的文件更新WebDB.config文件。

注意:确保将“复制到输出目录”选项中的webdb.config,webdb.debug.config和webdb.release.config设置为“请勿复制”。

希望这可以帮助!