在Visual Studio 2010中添加到网站项目的web.config转换功能在命令行和TFS构建中默认处于禁用状态。
有两个相对简单的解决方案:
选项1:编辑构建定义,并将以下内容添加到“MSBuild Arguments”字段中:
/p:UseWPP_CopyWebApplication=true /p:PipelineDependsOnBuild=false
使用UseWPP_CopyWebApplication将启用新的Web发布管道(WPP)进行构建。WPP执行web.config转换,并且还可以用来阻止诸如.PDB文件被复制到bin文件夹等操作。
选项2:MSBuild和WPP都是可完全扩展的。在与项目相同的目录中创建一个新的XML文件,并使用“.targets”扩展名,例如ProjectName.custom.targets。将以下MSBuild代码放入目标文件中:
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<UseWPP_CopyWebApplication>True</UseWPP_CopyWebApplication>
<PipelineDependsOnBuild>False</PipelineDependsOnBuild>
</PropertyGroup>
</Project>
右键单击您的网站,选择“卸载项目”。右键单击已卸载的项目并选择“编辑”。滚动到项目文件底部,查找以下行:
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
这些行是C#和Web项目构建过程的钩子。在CSharp导入之前立即插入自定义构建扩展(目标文件)的导入:
<Import Project="ProjectName.custom.targets"/>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
好了,你可以开始了。使用MSBuild自定义方法需要更多的设置工作,但好处是你可以使用新的目标文件来“挂钩”构建过程,并在服务器上更好地控制构建方式。例如,你可以挂钩任务来执行CSS和JS压缩。
我还建议查看“wpp targets” - 如果你使用特定名称“ProjectName.wpp.targets”命名另一个MSBuild文件,你可以控制整个网站发布过程。我们使用它来删除 -vsdoc JavaScript文档文件,因为发布的网站输出被复制:
<ItemGroup>
<ExcludeFromPackageFiles Include="Scripts\**\*-vsdoc.js;Resources\Scripts\**\-vsdoc.js">
<FromTarget>Project</FromTarget>
</ExcludeFromPackageFiles>
</ItemGroup>
总的来说,最好完全不要在构建过程中包含生产环境的web.config文件。我们直接将转换放在我们的生产部署机器上,并使用PowerShell在应用程序部署时进行转换。