vib*_*blo 6 configuration web-config visual-studio-2010
在我工作的团队中,我们拥有一个包含许多WCF Web服务的大型产品和一些使用这些服务的网站.我们即将升级到VS 2010,我正在考虑是否应该开始在VS 2010中使用新的配置转换功能.
我们有几个不同的环境需要不同的web.configs(数据库连接字符串,WCF地址等).通常在调试高级内容(例如Web前端)时,将其配置为直接连接到TEST或QA后端/数据库是有用的.在每个开发者的本地机器上的IIS直接配置到各个WCF/Web项目的源文件夹,并在本地运行时,是按Ctrl-Shift-B键或F5的一个简单的事情来调试的东西.人们可能会认为,这将有可能建立/与测试或QA的配置模式F5和得到测试/ QA的配置,但我看不出如何.它不受支持,或者我们是否需要改变我们处理事物的方式?
我们的另一个选择是使用简单的替换脚本作为预构建事件,从模板和密钥文件创建web.config,具体取决于配置模式.使用这种方法,你会得到测试配置,如果你在试验等编译,但感觉有点不好的推出我们自己的解决方案时,有内置到Visual Studio的功能.
您可以使用 .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>
Run Code Online (Sandbox Code Playgroud)
我必须手动将它们添加到 .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 的想法来自这篇文章。