在 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 目标” - 如果您使用特定名称“ProjectName.wpp.targets”命名另一个 MSBuild 文件,您可以控制整个网站发布过程。在复制发布的网站输出时,我们使用它来删除 -vsdoc javascript 文档文件:
<ItemGroup>
<ExcludeFromPackageFiles Include="Scripts\**\*-vsdoc.js;Resources\Scripts\**\-vsdoc.js">
<FromTarget>Project</FromTarget>
</ExcludeFromPackageFiles>
</ItemGroup>
一切都说了,你最好从你的构建中完全忽略生产 web.configs。我们将转换直接放在我们的生产部署机器上,并在部署应用程序时使用 powershell 进行转换。