您可以使用.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。
我已经接受这个答案,因为它似乎解决了问题(即使我没有测试过)。谢谢。最后,我们使用了一个自定义的构建后事件,就像我在最后一段中所写的那样,使用配置名称来决定如何替换的小模板创建web.config。 – viblo 2011-05-19 05:19:59
@viblo谢谢。我不确定我是否会使用我概述的方法,因为这是一种骇人听闻的方式,但我更加好奇它可以做或不做。无论哪种方式,很好的问题。 – rsbarro 2011-05-19 14:24:58
@rsbarro首先感谢您的干净答案。但是,我仍然有同样的问题“文件使用错误”。即使我添加了。你有其他建议吗?谢谢 –
curiousBoy
2013-11-21 23:05:09