.net-4.0 - Visual Studio 2010 使用 app.Config 转换不是Web Projects 的项目?

  显示原文与译文双语对照的内容

对于基于 Visual Studio 2010的网络应用程序,我们有配置转换功能,可以为不同的环境维护多个配置文件。 但同样的功能并不适用于 App.Config 文件是否有 Windows 服务/winforms或者控制台应用程序。

这里提供了一个可用的变通方法: 将XDT魔术应用到 App.Config

然而这并不简单,需要很多步骤。 是否有更简单的方法来实现 app.config 文件?

时间:

我尝试了几个解决方案,这是我发现的最简单的方法。
在评论中指出,最初的日志属于 Oleg Sych谢谢,Oleg

以下是说明:

1.。为项目添加一个XML文件到项目中。

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

2.卸载项目并打开。csproj文件以编辑

Visual Studio 允许你编辑 。csproj 把最精彩的内容editor—you只需要先卸载该项目。 然后right-click在它上面并选择编辑 <ProjectName> 。csproj

3 带绑定程序。* 。config文件复制到主 App.config

查找包含所有 App.configApp.*.config 引用的项目文件节。 你会注意到他们的构建操作设置为 None:


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

首先,为所有的Content 设置构建操作。
下一步,使所有 configuration-specific 受养人 文件在主 App.config 所以 Visual Studio 将它的分组像它的设计器和代码隐藏文件。

用下面的替换上面的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)MicrosoftVisualStudiov10.0WebMicrosoft.Web.Publishing.Tasks.dll"/>
 <Target Name="AfterCompile" 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.Release.config 。 然后将此行添加到csproj文件。


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

这样不但可以产生正确的但是如果你正在使用安装和部署项目在 Visual Studio myprogram.exe.config 文件来生成微星科技,它将促进包装时部署项目,以便使用正确的配置文件。

根据我的经验,我需要做的事情是连接字符串,硬件和通常smpt的设置。 配置系统允许在单独的文件中指定这些东西。 因此你可以在你的app 。config/Web.Config 中使用它:


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

我通常做的是把这些config-specific节放在单独的文件中,在一个名为 ConfigFiles ( 在解决方案根或者项目级别,取决于)的子文件夹中。 我定义了每个配置的文件,比如 smtp.config.Debug 和 smtp.config.Release 。

然后你就可以像这样定义一个pre-build事件:


copy $(ProjectDir)ConfigFilessmtp.config.$(ConfigurationName) $(TargetDir)smtp.config

在团队开发中,可以通过在约定中包括 %COMPUTERNAME% 和/或者 %USERNAME% 来进一步调整。

当然,这意味着目标文件( x 。config配置) 不应放在源代码管理( 因为它们是生成的) 中。 你仍然应该将它们添加到项目文件中,并将它们的输出类型属性设置为'总是复制'或者'如果更新则复制'。

简单,可以扩展,它适用于所有类型的Visual Studio 项目( 控制台,winforms,wpf,站点) 。

可以在每个配置中使用单独的配置文件,比如 app.Debug. 配置,app.Release.config,然后在项目 file: 中使用配置变量


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

这将根据你正在构建的配置创建正确的ProjectName.exe.config 文件。

受到 Oleg 和其他问题的启发,我将解决方案 http://stackoverflow.com 5109530/2286801 更进一步,以启用以下步骤。

  • 使用 ClickOnce
  • 在 vs 2010中使用安装和部署项目
  • 使用 VS2010,2013 ( 没有测试 2012,虽然应该能正常工作) 。
  • 团队构建一起工作。( 你必须安装一个) Visual Studio 或者) Microsoft.Web. Publishing.targets 和 Microsoft.Web. Publishing.Tasks.dll

这里解决方案通过在 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)MicrosoftVisualStudiov$(VisualStudioVersion)WebMicrosoft.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 允许你在editor—you中编辑。只需先卸载项目。 然后在上面right-click并选择编辑。csproj 。

3 带绑定程序。* 。config文件复制到主 App.config

找到包含所有 App.config 和 app 。* 。config引用的项目文件节,并按如下方式替换。 你会注意到我们不用内容而不是内容。


<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"/>

已完成!

...