如何在本地运行/调试时使用Visual Studio 2010配置转换?

时间:2010-08-06 08:56:07

标签: visual-studio-2010 configuration web-config

在我工作的团队中,我们有一个很大的产品,有很多WCF Web服务和一些使用这些服务的网站。我们即将升级到VS 2010,我正在考虑是否应该开始在VS 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 个答案:

答案 0 :(得分:1)

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

我在测试项目中试过这个,这是我对.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>

我不得不手动将这些添加到.csproj文件中(我使用的是Notepad ++)。据我所知,没有办法通过VS.NET IDE添加这些指令。您需要在AfterBuild上提供条件以避免使用循环引用,因为对MSBuild的调用将重新运行构建以生成web.config转换。

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

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

FirstRun的想法来自post