【问题标题】:Web.config-style transforms for App.config files for C# Console apps?C# 控制台应用程序的 App.config 文件的 Web.config 样式转换?
【发布时间】:2013-10-27 16:24:29
【问题描述】:

我的团队喜欢发布个人资料。我们有许多我们工作的测试环境,并且使用 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

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

Properties
    PublishProfiles
        dev.pubxml
        int.pubxml
        prod.pubxml

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

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

【问题讨论】:

    标签: c# msbuild web-config app-config web-config-transform


    【解决方案1】:

    将多个 app.configs 添加到控制台应用程序:

    我使用的是 Visual Studio 2013。在这个版本中,我们没有配置转换。请安装configuration transformation extension

    首先在解决方案配置中添加环境。右键单击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>
    

    最后,构建解决方案。

    【讨论】:

      【解决方案2】:

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

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

      它只对我有用:)

      【讨论】:

      • web.config的转换不是已经集成在VS2012中了吗?我很想知道您为什么使用 3rd 方插件。
      • 对于 web.config,是的。不适用于 App.config,也不适用于 VS2010(我偶尔会使用)。
      【解决方案3】:

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

      对于 Azure WebJobs 项目,.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's answer.

      【讨论】:

        【解决方案4】:

        我推荐这篇博文:

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

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

        【讨论】:

          【解决方案5】:

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

          <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. 将临时文件复制到主文件。您需要 OverwriteReadOnlyFiles,因为 TFS 可能会锁定它。

          【讨论】:

            猜你喜欢
            • 2012-04-21
            • 2022-11-11
            • 2020-08-11
            • 2010-09-14
            • 1970-01-01
            • 2014-09-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多