适用于 C# 控制台应用的 App.config 文件的 Web.config 样式转换

本文关键字:config 文件 样式 转换 Web App 控制台 应用 适用于 | 更新日期: 2023-09-27 18:36:08

我的团队爱上了发布配置文件。我们有许多测试环境,使用 Web.config 转换,我们能够替换每个环境中的计算机名称、配置设置等,这使得我们的构建/部署/测试过程变得更加容易。

例如:

Web.config
    Web.dev.config
    Web.int.config
    Web.prod.config

但是,我们有许多测试应用程序用于访问我们的 Web 服务,这些应用程序作为控制台应用程序实现。我们希望能够在这些配置文件上执行相同类型的转换,以便我们可以减少在拾取构建拖放时与手动编辑配置文件相关的测试的手动劳动。

本质上,我们想要这个:

App.config
    App.dev.config
    App.int.config
    App.prod.config

我对这些配置转换的理解是,它们与我们 Web 项目中相应的发布配置文件相关:

Properties
    PublishProfiles
        dev.pubxml
        int.pubxml
        prod.pubxml

我尝试将类似的文件添加到我们的控制台应用程序项目中,但我怀疑这是 Web 发布 MSBuild 目标中实际利用它们的内容。

有没有办法专门挂接到构建的这一部分,以便我们可以转换非 Web 配置?

适用于 C# 控制台应用的 App.config 文件的 Web.config 样式转换

若要将多个 app.config 添加到控制台应用程序,请执行以下操作:

我正在使用Visual Studio 2013。 在此版本中,我们没有配置转换。请安装配置转换扩展。

首先在解决方案配置中添加环境。右键单击App.config文件。单击添加配置转换。它添加的解决方案配置与解决方案配置一样多。

App.config

<appSettings>
    <add key="key" value="some value" />   
</appSettings>

App.Release.Config中复制此代码:

<appSettings>
    <add key="same key which you have given in app.config" value="some new value" xdt:Transform="Replace" xdt:Locator="Match(key)" />   
 </appSettings>

最后,生成解决方案。

我一直在为 Azure WebJobs 项目寻找一个简单的解决方案,以便在构建过程中转换 App.config,该解决方案可在服务器上与 Visual Studio 和 MSBuild 配合使用。

对于 Azure Web 作业项目,对.csproj以下内容有所帮助:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)'Microsoft'VisualStudio'v12.0'Web'Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterCompile" Condition="Exists('App.$(configuration).config')">
    <Message Text="Transforming config files..." Importance="high" />
    <TransformXml Source="App.config" Transform="App.$(Configuration).config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" />
    <PropertyGroup>
      <AppConfig>$(IntermediateOutputPath)$(TargetFileName).config</AppConfig>
    </PropertyGroup>
    <ItemGroup>
        <AppConfigWithTargetPath Remove="App.config" />
        <AppConfigWithTargetPath Include="$(AppConfig)" Condition="'$(AppConfig)'!=''">
            <TargetPath>$(TargetFileName).config</TargetPath>
        </AppConfigWithTargetPath>
    </ItemGroup>
</Target>

适用于构建,无需扩展,并且不会就地覆盖 App.config。基于Dhia Louhichi的回答。

我为此找到的最简单的解决方案是使用 Slowcheetah; 他们的网站上有使用 MSBuild 等的教程,我相信在从 Dev 推送到 QA 等后可以正确切换。

http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5

它只对我有用:)

我建议这篇博文:

http://blogs.msdn.com/b/webdev/archive/2010/11/17/xdt-web-config-transforms-in-non-web-projects.aspx

它说明了如何将 xdt 转换也与 WPF 项目配置文件一起使用。我按照这些说明处理了一些控制台应用程序,效果很好。我正在使用VS2012 Express,但我想它也适用于VS2010。

最近我设置了一个构建服务器,这就是我最终使用的:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)'Microsoft'VisualStudio'v12.0'Web'Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="BeforeBuild" Condition="">
    <Message Text="Transforming Configs files..." Importance="high" />
    <TransformXml Source="App_Data'config'appSettings.config" Transform="App_Data'config'appSettings.$(Configuration).config" Destination="App_Data'config'appSettings_temp.config" />
    <Copy SourceFiles="App_Data'config'appSettings_temp.config" DestinationFiles="App_Data'config'appSettings.config" OverwriteReadOnlyFiles="True" />
    <Delete Files="App_Data'config''appSettings_temp.config" />
  </Target>

解释:

  1. 通过 UsingTask 导入 TransformXml 任务(确保设置了正确的 Visual Studio 任务路径)
  2. 显示自定义消息。(您可以将重要性设置为高、正常、低)
  3. 调用 TransformXml 任务并创建一个临时文件。
  4. 将临时文件复制到主文件。您需要覆盖只读文件,因为 TFS 可能会锁定它。