2010-08-06 97 views
6

在我工作的团队中,我们有一个包含许多WCF Web服务和一些使用这些服务的网站的大产品。我们即将升级到VS 2010,我正在研究是否应该开始使用VS 2010中的新配置转换功能。如何在本地运行/调试时使用Visual Studio 2010配置转换?

我们有几个不同的环境,它们需要不同的web.configs(数据库连接字符串,WCF地址等)。通常,在调试诸如Web前端之类的高级内容时,将其配置为直接与TEST或QA后端/数据库连接非常有用。在每个开发人员的本地机器上,IIS都直接配置到每个WCF/web项目的源文件夹中,并且在本地运行时,只需按Ctrl-Shift-B或F5即可调试。 有人会认为可以使用TEST或QA作为配置模式来构建/ F5并获得TEST/QA配置,但我不知道如何。它不被支持,或者我们需要改变我们如何处理事情?

我们的其他选择是使用一个简单的替换脚本作为预构建事件,根据配置模式从模板和密钥文件创建web.config。使用这种方法,如果您在TEST中进行编译等,您将获得TEST配置,但在Visual Studio中内置函数时,推出我们自己的解决方案时感觉有点不好。

回答

1

您可以使用.csproj文件中提供的BeforeBuild和AfterBuild目标来达到您要查找的效果。 VS.NET IDE将在执行Build或Rebuild时执行这些目标,因此您可以使用它们来执行web.config转换。由于您需要执行web.config转换,然后覆盖实际的web.config文件,因此您需要依赖名为web.default.config的新文件来存储基本web.config数据。

我在测试项目中尝试了这一点,这里是我的.csproj的文件所做的更改:我不得不手动添加这些到.csproj的文件

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" /> 
<ProjectExtensions> 
... 
</ProjectExtensions> 
<Target Name="BeforeBuild"> 
    <Copy SourceFiles="$(ProjectDir)web.default.config" DestinationFiles="$(ProjectDir)web.config" /> 
</Target> 
<Target Name="AfterBuild" Condition="$(FirstRun) != 'false'"> 
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="TransformWebConfig" Properties="FirstRun=false;" /> 
    <Sleep Milliseconds="2000" /> 
    <Copy SourceFiles="$(ProjectDir)obj\$(ConfigurationName)\TransformWebConfig\transformed\web.config" 
     DestinationFiles="$(ProjectDir)web.config" /> 
</Target> 

(我用记事本+ +)。据我所知,无法通过VS.NET IDE添加这些指令。您需要在AfterBuild上提供条件以避免产生循环引用,因为对MSBuild的调用将重新运行构建以生成web.config变换。

基本上我们正在做的是在开始构建之前将web.default.config文件(我们的基本模板)复制到现有的web.config中,然后我们使用MSBuild为任何配置生成web.config我们正在建设。转换完成后,我们使用复制任务来获取转换后的文件,并将其复制到Web根目录中的web.config文件中。偶尔遇到的一个问题是在转换完成后尝试覆盖web.config时出现文件使用错误。在MSBuild任务处理该问题后添加睡眠任务(从MSBuildCommunityTasks)。

我只使用内置的ASP.NET服务器而不是IIS来测试这种方法,所以YMMV,但我觉得这是一个可行的解决方案。

FirstRun的想法来自于这个post

+0

我已经接受这个答案,因为它似乎解决了问题(即使我没有测试过)。谢谢。最后,我们使用了一个自定义的构建后事件,就像我在最后一段中所写的那样,使用配置名称来决定如何替换的小模板创建web.config。 – viblo 2011-05-19 05:19:59

+0

@viblo谢谢。我不确定我是否会使用我概述的方法,因为这是一种骇人听闻的方式,但我更加好奇它可以做或不做。无论哪种方式,很好的问题。 – rsbarro 2011-05-19 14:24:58

+0

@rsbarro首先感谢您的干净答案。但是,我仍然有同样的问题“文件使用错误”。即使我添加了。你有其他建议吗?谢谢 – curiousBoy 2013-11-21 23:05:09

相关问题