对于基于Visual Studio 2010 Web的应用程序,我们具有配置转换功能,通过该功能,我们可以维护不同环境的多个配置文件。但是,适用于Windows Services/Winforms或Console应用程序的App.Config文件不可用。

如下所示,有一个解决方法: 将XDT魔术应用于app.config.

但是,它并不简单,需要多个步骤。是否有一种更简单的方法可以为app.config文件实现相同的方法吗?

有帮助吗?

解决方案

现在,与本文处理的视觉工作室Addin一起使用: slowcheetah -Web.config转换语法现在为任何XML配置文件概括.

您可以右键单击Web.config,然后单击“添加配置变换”。当您这样做时,您将获得Web.debug.config和web.release.config。如果愿意,只要名称与配置配置文件对齐,就可以制作web.config。这些文件只是您想要的更改,而不是Web.config的完整副本。

您可能会认为您想使用XSLT来转换Web.config,但是尽管它们直观地感觉正确,但实际上是冗长的。

这是两个转换,一种使用XSLT,使用XML文档转换语法/名称空间相同的变换。与所有事物一样,XSLT中有多种方法可以做到这一点,但是您会得到一般的想法。 XSLT是一种广义的树转换语言,而该部署则针对常见场景的特定子集进行了优化。但是,很酷的部分是每个XDT变换都是.NET插件,因此您可以自己制作。

<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@*|node()">
  <xsl:copy>           
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="/configuration/appSettings">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
    <xsl:element name="add">
      <xsl:attribute name="key">NewSetting</xsl:attribute>
      <xsl:attribute name="value">New Setting Value</xsl:attribute>
    </xsl:element>
  </xsl:copy>
</xsl:template>
</xsl:stylesheet>

或通过部署变换的同一件事:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
   <appSettings>
      <add name="NewSetting" value="New Setting Value" xdt:Transform="Insert"/>
   </appSettings>
</configuration>

其他提示

我尝试了几种解决方案,这是我个人发现的最简单的解决方案。
在评论中指出 原始帖子 属于 Oleg Sych谢谢,Oleg!

这是说明:

1.将每个配置的XML文件添加到项目中。

通常你会有 DebugRelease 配置,请命名您的文件 App.Debug.configApp.Release.config. 。在我的项目中,我为每种环境创建了一个配置,因此您可能需要尝试一下。

2.卸载项目并打开.CSPROJ文件进行编辑

Visual Studio允许您编辑 .csproj 编辑器中的文件 - 您只需要先卸载项目即可。然后右键单击它,然后选择 编辑u003CProjectName>.csproj.

3.绑定应用程序。*。配置文件到main App.Config

查找包含全部的项目文件部分 App.configApp.*.config 参考。您会注意到他们的构建动作设置为 None:

<None Include="App.config" />
<None Include="App.Debug.config" />
<None Include="App.Release.config" />

首先,为所有人设置构建行动 Content.
接下来,全部 特定于配置 文件 依赖 在主 App.config 因此,Visual Studio像Designer和Code-Behind文件一样将它们分组。

将上面的XML替换为以下一个:

<Content Include="App.config" />
<Content Include="App.Debug.config" >
  <DependentUpon>App.config</DependentUpon>
</Content>
<Content Include="App.Release.config" >
  <DependentUpon>App.config</DependentUpon>
</Content>

4.激活转换魔术

在文件结尾之后

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

在决赛之前

</Project>

插入以下XML:

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="CoreCompile" Condition="exists('app.$(Configuration).config')">
    <!-- Generate transformed app config in the intermediate directory -->
    <TransformXml Source="app.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="app.$(Configuration).config" />
    <!-- Force build process to use the transformed configuration file from now on. -->
    <ItemGroup>
      <AppConfigWithTargetPath Remove="app.config" />
      <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
        <TargetPath>$(TargetFileName).config</TargetPath>
      </AppConfigWithTargetPath>
    </ItemGroup>
  </Target>

现在您可以重新加载项目,建立并享受 App.config 转型!

供参考

确保您 App.*.config 文件具有正确的设置:

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
     <!--magic transformations here-->
</configuration>

我发现的另一个解决方案是不使用转换,而只有一个单独的配置文件,例如app.release.config。然后将此行添加到您的CSPROJ文件中。

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
    <AppConfig>App.Release.config</AppConfig>
  </PropertyGroup>

这不仅将生成正确的myProgram.exe.config文件,而且如果您在Visual Studio中使用设置和部署项目来生成MSI,它将迫使部署项目在打包时使用正确的配置文件。

根据我的经验,我需要使环境特定的事情是连接字符串,应用程序设置和经常设置设置之类的东西。配置系统允许在单独的文件中指定这些内容。因此,您可以在app.config/web.config中使用它:

 <appSettings configSource="appsettings.config" />
 <connectionStrings configSource="connection.config" />
 <system.net>
    <mailSettings>
       <smtp configSource="smtp.config"/>
    </mailSettings>
 </system.net>

我通常要做的是将这些特定于配置的部分放在单独的文件中,在称为configfiles的子文件夹中(在解决方案根或项目级别中,取决于)。我为每个配置定义文件,例如smtp.config.debug和smtp.config.release。

然后,您可以定义这样的预建事件:

copy $(ProjectDir)ConfigFiles\smtp.config.$(ConfigurationName) $(TargetDir)smtp.config

在团队开发中,您可以通过在大会中包括%computername%和/或%用户名%进行进一步调整。

当然,这意味着目标文件(X.Config)不应将其放置在源控制中(因为它们是生成的)。您仍然应该将它们添加到项目文件中,并将其输出类型属性设置为“始终复制”或“复制”,如果更新”。

简单,可扩展,并且适用于所有类型的Visual Studio项目(控制台,Winforms,WPF,Web)。

受到启发 Oleg 还有其他问题,我采用了解决方案 https://stackoverflow.com/a/5109530/2286801 进一步启用以下内容。

  • 使用ClickOnce
  • 在VS 2010中使用设置和部署项目
  • 与VS2010、2013、2015的VS2010合作(尽管也应该工作,但未测试2012年)。
  • 与团队构建一起工作。 (您必须安装a)Visual Studio或B)Microsoft.web.publishing.targets和Microsoft.web.publishing.tasks.dll)

该解决方案通过在msbuild进程中首次引用app.config之前执行app.config转换。它使用外部目标文件,以更轻松地管理多个项目。

指示:

与其他解决方案相似。我引用了仍然相同的内容,并将其包括在内,以进行完整和更容易的比较。

0.在您的项目中添加一个新文件,称为AppConfigtransformation.targets

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- Transform the app config per project configuration.-->
  <PropertyGroup>
    <!-- This ensures compatibility across multiple versions of Visual Studio when using a solution file.
         However, when using MSBuild directly you may need to override this property to 11.0 or 12.0 
         accordingly as part of the MSBuild script, ie /p:VisualStudioVersion=11.0;
         See http://blogs.msdn.com/b/webdev/archive/2012/08/22/visual-studio-project-compatability-and-visualstudioversion.aspx -->
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
  </PropertyGroup>

  <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.targets" />

  <Target Name="SetTransformAppConfigDestination" BeforeTargets="PrepareForBuild" 
          Condition="exists('app.$(Configuration).config')">
    <PropertyGroup>
      <!-- Force build process to use the transformed configuration file from now on. -->
      <AppConfig>$(IntermediateOutputPath)$(TargetFileName).config</AppConfig>
    </PropertyGroup>
    <Message Text="AppConfig transformation destination: = $(AppConfig)" />
  </Target>

  <!-- Transform the app.config after the prepare for build completes. -->
  <Target Name="TransformAppConfig" AfterTargets="PrepareForBuild" Condition="exists('app.$(Configuration).config')">
    <!-- Generate transformed app config in the intermediate directory -->
    <TransformXml Source="app.config" Destination="$(AppConfig)" Transform="app.$(Configuration).config" />
  </Target>

</Project>

1.将每个配置的XML文件添加到项目中。

通常,您将进行调试和发布配置,因此请命名您的文件app.debug.config和app.release.config。在我的项目中,我为每种环境创建了一个配置,因此您可能需要尝试一下。

2.卸载项目并打开.CSPROJ文件进行编辑

Visual Studio允许您在编辑器中编辑.CSPROJ,您只需要先卸载项目即可。然后右键单击它,然后选择“编辑.csproj”。

3.绑定应用程序。*。配置文件到main App.Config

查找包含所有app.config和app的项目文件部分。*。配置引用,然后替换如下。您会注意到我们没有使用而不是内容。

<ItemGroup>
  <None Include="app.config"/>
  <None Include="app.Production.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
  <None Include="app.QA.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
  <None Include="app.Development.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
</ItemGroup>

4.激活转换魔术

在文件结尾之后

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

在决赛之前

</Project>

插入以下XML:

<Import Project="AppConfigTransformation.targets" />

完毕!

您可以每个配置使用单独的配置文件,例如app.debug.config,app.release.config,然后在项目文件中使用配置变量:

<PropertyGroup>
    <AppConfig>App.$(Configuration).config</AppConfig>
</PropertyGroup>

然后,这将根据您正在构建的配置而创建正确的projectName.exe.config文件。

我写了不错的扩展名来自动化app.config转换,就像内置的Web应用程序项目一样 配置变换

该扩展程序的最大优点是您不需要在所有构建机器上安装它

因此,我最终采取了略有不同的方法。我遵循DAN的步骤贯穿步骤3,但添加了另一个文件:app.base.config。该文件包含您在每个生成的app.config中所需的配置设置。然后,我将Forter Build(与Yuri添加到TransformXML中)将带有基本配置的当前配置转换为App.Config。然后,构建过程使用转换的app.config正常。但是,一种烦恼是您想从源控件中排除不断变化的app.config,但是其他配置文件现在依赖于此。

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="BeforeBuild" Condition="exists('app.$(Configuration).config')">
    <TransformXml Source="App.Base.config" Transform="App.$(Configuration).config" Destination="App.config" />
  </Target>

从MarketPlace中安装“配置转换工具”并重新启动VS。您也可以看到app.config的菜单预览变换。

https://marketplace.visualstudio.com/items?itemname=golanavraham.configurationTransform

我用这个工具解决了这个问题 http://ctt.codeplex.com/. 。我将其与CCNET/NANT脚本一起制作包装。

对目前无处不在的解决方案的改进只是一点点改进:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  • 也就是说,除非您打算永远留在当前的VS版本中

我已经为Vishal Joshi发布的替代方案创建了另一种选择 内容 被删除并为ClickOnce部署提供了基本支持。我说基本,因为我没有彻底测试它,但是它应该在典型的ClickOnce部署方案中起作用。

该解决方案由一个单一的MSBUILD项目组成,该项目曾经导入到存在的Windows应用程序项目(*.CSPROJ)将构建过程扩展到考虑App.Config转换。

您可以在 Visual Studio App.Config XML转换 MSBuild项目文件可以是 从Github下载.

如果您使用TFS Online(云版本),并且想在项目中转换App.config,则可以在不安装任何额外工具的情况下执行以下操作。从vs =>卸载项目=>编辑项目文件=>转到文件的底部,并添加以下内容:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterBuild" Condition="Exists('App.$(Configuration).config')">
<TransformXml Source="App.config" Transform="App.$(Configuration).config" Destination="$(OutDir)\$(AssemblyName).dll.config" />

AssemblyFile和目的地可用于本地使用和TFS Online(Cloud)服务器。

当从另一个项目中引用带有配置文件的类库时,建议的解决方案将不起作用(在我的情况下是Azure Works项目库)。它不会从 obj 文件夹进入 bin\##configuration-name## 文件夹。为了使其与最小的更改一起使用,您需要更改 AfterCompile 目标 BeforeCompile:

<Target Name="BeforeCompile" Condition="exists('app.$(Configuration).config')">
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top