如何为几个构buildconfigurationselect不同的app.config

我有一个包含MSTest集成testing的dlltypes的项目 。 在我的机器上testing通过了,我想要在CI服务器上发生同样的事情(我使用TeamCity)。 但testing失败,因为我需要调整app.config中的一些设置。 这就是为什么我想有一个单独的第二个app.config文件,将保存CI服务器的设置。

所以我想有

 / SLN
  / PROJ
   app.config(我认为这是VS所要求的)
   app.Release.config(这是一个独立的独立configuration文件)

因此,如果我在configuration项中select发布configuration,我想使用app.Release.config文件而不是app.config

问题
对于简单的.dlltypes的项目,这似乎并不简单。 对于web项目,我可以做webconfiguration转换。 我发现了一个黑客如何做一个dlltypes的项目这些转换,但我不是一个黑客的粉丝。


什么是调整app.config文件的标准方法,这取决于.NET项目的构buildconfiguration(如Debug,Release,…)?

使用SlowCheetah插件。 有关如何使用SlowCheetah的更多选项和详细信息,请继续阅读。

正如您已经注意到的那样,对于一个Librarytypes(.dll)项目使用不同的configuration文件没有默认和简单的方法。 原因是目前的想法是:“你不需要”! 框架开发人员认为你需要configuration可执行文件:无论是控制台,桌面,networking,移动应用程序或其他东西。 如果你开始提供一个dll的configuration,你可能会得到一些我可以调用一个configuration的地狱 。 你可能不再理解(容易)为什么这个和那个variables有这么奇怪的价值,似乎从来不知道。

“坚持下去” – 你可能会说,“但是我需要这个来进行集成/unit testing,而且这是一个图书馆!” 这是真的,这是你可以做的(只选一个,不要混用):

1. SlowCheetah – 转换当前configuration文件

您可以安装SlowCheetah – 一个Visual Studio插件,为您执行所有低级别的XML戳动(或转换)。 它的工作方式如下:

  • 安装SlowCheetah并重新启动Visual Studio(Visual Studio>工具>扩展和更新…>联机> Visual Studio库>search“慢猎豹”)
  • 定义您的解决schemeconfiguration( debugging发布默认情况下),您可以添加更多(右键单击解决scheme资源pipe理器 > configurationpipe理器… > 主动解决schemeconfiguration > 新…
  • 根据需要添加一个configuration文件
  • 右键点击configuration文件> 添加变换
    • 这将创build转换文件 – 每个configuration一个
    • 转换文件作为注入器/增变器,他们在原configuration文件中find需要的XML代码,并注入新的行或改变所需的值,无论你告诉它做什么

2.提供.proj文件 – 复制 – 重新命名一个全新的configuration文件

原来是从这里拿走的。 这是一个可以embedded到Visual Studio .proj文件中的自定义MSBuild任务。 将以下代码复制并粘贴到项目文件中

<Target Name="AfterBuild"> <Delete Files="$(TargetDir)$(TargetFileName).config" /> <Copy SourceFiles="$(ProjectDir)\Config\App.$(Configuration).config" DestinationFiles="$(TargetDir)$(TargetFileName).config" /> </Target> 

现在在名为Config的项目中创build一个文件夹,并在其中添加新文件: App.Debug.configApp.Release.config等。 现在,根据您的configuration,Visual Studio将从Config文件夹中selectConfig文件,并将其复制到输出目录中。 所以,如果你有PatternPA.Test.Integration项目和一个debuggingconfigurationselect,在构build后的输出文件夹中,你会发现一个PatternPa.Test.Integration.dll.config文件从Config\App.Debug.config复制Config\App.Debug.config命名之后。

这些是你可以在configuration文件中留下的注释

 <?xml version="1.0" encoding="utf-8"?> <configuration> <!-- This file is copied and renamed by the 'AfterBuild' MSBuild task --> <!-- Depending on the configuration the content of projectName.dll.config is fully substituted by the correspondent to build configuration file from the 'Config' directory. --> </configuration> 

在Visual Studio中,你可以有这样的东西

项目结构

3.使用Visual Studio以外的脚本文件

每个构build工具(如NAnt , MSBuild )将根据configuration提供转换configuration文件的function。 如果您在构build计算机上构build解决scheme,那么这非常有用,您需要更好地控制准备发布产品的方式和方式。

例如,您可以使用Web发布DLL的任务来转换任何configuration文件

 <UsingTask AssemblyFile="..\tools\build\Microsoft.Web.Publishing.Tasks.dll" TaskName="TransformXml"/> <PropertyGroup> <!-- Path to input config file --> <TransformInputFile>path to app.config</TransformInputFile> <!-- Path to the transformation file --> <TransformFile>path to app.$(Configuration).config</TransformFile> <!-- Path to outptu web config file --> <TransformOutputFile>path to output project.dll.config</TransformOutputFile> </PropertyGroup> <Target Name="transform"> <TransformXml Source="$(TransformInputFile)" Transform="$(TransformFile)" Destination="$(TransformOutputFile)" /> </Target> 

您可以尝试以下方法:

  1. 在解决scheme资源pipe理器中右键单击该项目,然后select卸载项目
  2. 该项目将被卸载。 再次右键单击项目并select编辑<YourProjectName> .csproj
  3. 现在,您可以在Visual Studio中编辑项目文件。
  4. find包含应用程序configuration文件的* .csproj文件中的位置。 它会看起来像:
     <的ItemGroup>
         <None Include =“App.config”/>
     </的ItemGroup>
  1. 用以下代替这一行:
     <ItemGroup Condition =“'$(Configuration)'=='Debug'”>
         <None Include =“App.Debug.config”/>
     </的ItemGroup>

     <ItemGroup Condition =“'$(Configuration)'=='Release'”>
         <None Include =“App.Release.config”/>
     </的ItemGroup>

我还没有尝试过这种方法来app.config文件,但它与其他项目的Visual Studio项目工作正常。 您可以以任何您喜欢的方式自定义构build过程。 无论如何,让我知道结果。

你应该考虑ConfigGen 。 它是为此目的而开发的。 它根据模板文件和设置文件为每个部署机器生成一个configuration文件。 我知道这不是专门回答你的问题,但它可以很好地回答你的问题。

因此,而不是debugging,发布等,你可能有testing,UAT,生产等你也可以有不同的设置每个开发机器,以便您可以生成一个特定于您的开发机器的configuration,并改变它,而不影响其他人的部署。

用法的例子可能是…

 <Target Name="BeforeBuild"> <Exec Command="C:\Tools\cfg -s $(ProjectDir)App.Config.Settings.xls -t $(ProjectDir)App.config.template.xml -o $(SolutionDir)ConfigGen" /> <Exec Command="C:\Tools\cfg -s $(ProjectDir)App.Config.Settings.xls -t $(ProjectDir)App.config.template.xml -l -n $(ProjectDir)App.config" /> </Target> 

如果你把它放在你的.csproj文件中,并且你有以下文件…

 $(ProjectDir)App.Config.Settings.xls MachineName ConfigFilePath SQLServer default App.config DEVSQL005 Test App.config TESTSQL005 UAT App.config UATSQL005 Production App.config PRODSQL005 YourLocalMachine App.config ./SQLEXPRESS $(ProjectDir)App.config.template.xml <?xml version="1.0" encoding="utf-8" standalone="yes"?> <configuration> <appSettings> <add key="ConnectionString" value="Data Source=[%SQLServer%]; Database=DatabaseName; Trusted_Connection=True"/> </appSettings> </configuration> 

那么这将是结果…

从第一个命令,为在xls文件中指定的每个环境生成一个configuration文件,放置在输出目录$(SolutionDir)ConfigGen

 .../solutiondir/ConfigGen/Production/App.config <?xml version="1.0" encoding="utf-8" standalone="yes"?> <configuration> <appSettings> <add key="ConnectionString" value="Data Source=PRODSQL005; Database=DatabaseName; Trusted_Connection=True"/> </appSettings> </configuration> 

从第二个命令开发机器上使用的本地App.config将replace为由本地(-l)开关和文件名(-n)开关指定的生成configuration。

像罗密欧一样使用我适应vs2010的方法

  <None Condition=" '$(Configuration)' == 'Debug' " Include="appDebug\App.config" /> <None Condition=" '$(Configuration)' == 'Release' " Include="appRelease\App.config" /> 

在这里你需要保持两个appconfig在不同的目录appDebug和appRelease我testing,它工作正常! Ragards

我正在使用XmlPreprocess工具进行configuration文件操作。 它在多个环境中使用一个映射文件(或者在您的情况下使用多个构build目标)。 您可以通过Excel编辑映射文件。 这是非常容易使用。

来自VisualStudio Gallery的SlowCheetah和FastKoala似乎是非常好的工具,可以帮助解决这个问题。

然而,如果你想避免插件或者使用他们在你的构build/整合过程中更广泛地实现的原则,那么把它添加到你的msbuild * proj文件中就是一个速记。

注意:这或多或less是@ oleksii的答案的第二个返工。

这适用于.exe和.dll项目:

  <Target Name="TransformOnBuild" BeforeTargets="PrepareForBuild"> <TransformXml Source="App_Config\app.Base.config" Transform="App_Config\app.$(Configuration).config" Destination="app.config" /> </Target> 

这适用于Web项目:

  <Target Name="TransformOnBuild" BeforeTargets="PrepareForBuild"> <TransformXml Source="App_Config\Web.Base.config" Transform="App_Config\Web.$(Configuration).config" Destination="Web.config" /> </Target> 

请注意,即使在构build正确开始之前,此步骤也会发生。 configuration文件的转换发生在项目文件夹中。 这样,转换后的web.config就可以在debugging时使用(SlowCheetah的一个缺点)。

请记住,如果您创build了App_Config文件夹(或者您select调用它的任何文件夹),则各种中间configuration文件应该具有“生成操作”=“无”,并且“复制到输出目录”=不要复制。

经过一些关于开发和构buildconfiguration的研究和构build等,我决定推出自己的,我已经在codeplex上提供: https ://contemplate.codeplex.com/

这多个configuration文件适用于多个环境,其基本configuration条目replace工具可以与任何基于文本的文件格式一起使用。

希望这可以帮助。

查看XDT(web.config)转换引擎是否可以帮助您。 目前它只支持Web项目,但从技术上讲,没有什么能阻止你在其他应用程序types中使用它。 有许多关于如何通过手动编辑项目文件来使用XDT的指南,但是我发现了一个很好的插件: https : //visualstudiogallery.msdn.microsoft.com/579d3a78-3bdd-497c-bc21-aa6e6abbc859

该插件只是帮助设置configuration,不需要构build,解决scheme可以在其他机器或构build服务器上构build,无需插件或任何其他工具。

我已经用我在这里find的解决scheme解决了这个问题: http : //www.blackwasp.co.uk/SwitchConfig.aspx

简而言之,他们所说的是:“通过添加一个后生成事件。[…]我们需要添加以下内容:

 if "Debug"=="$(ConfigurationName)" goto :nocopy del "$(TargetPath).config" copy "$(ProjectDir)\Release.config" "$(TargetPath).config" :nocopy