在此处找到答案:http :
//www.digitallycreated.net/Blog/59/locally-publishing-a-vs2010-asp.net-web-application-using-msbuild
Visual Studio 2010具有出色的新Web应用程序项目发布功能,使您可以通过单击按钮轻松发布Web应用程序项目。在幕后,Web.config转换和程序包构建是通过将大型MSBuild脚本导入到您的项目文件中完成的(位于:C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft .Web.Publishing.targets)。不幸的是,该脚本非常复杂,混乱并且没有文档记录(其他情况下文件中的拼写常常很差,而且几乎没有用)。该文件的大流程图和一些有关如何链接到该文件的文档会很不错,但是似乎很遗憾地缺少(或者至少我找不到它)。
不幸的是,这意味着通过命令行执行发布比需要的更加不透明。我对这方面的文档不足感到惊讶,因为这些天很多商店都使用连续集成服务器,有些甚至进行自动化部署(VS2010发布功能可能会起到很大帮助),所以我会认为启用此功能(轻松!)将一直是该功能的主要要求。
无论如何,在浏览了Microsoft.Web.Publishing.targets文件数小时之后,我反复试验和错误墙,我设法弄清楚了Visual Studio似乎是如何执行魔术的,只需单击“发布到文件系统”和“构建部署包”功能。我将介绍一些MSBuild脚本,因此,如果您不熟悉MSBuild,建议您查看此速成班MSDN页面。
发布到文件系统
VS2010的“发布到文件系统”对话框“发布到文件系统”对话框花了我一段时间,因为我希望可以合理地使用MSBuild。相反,VS2010做了一些很奇怪的事情:它调用MSBuild进行某种半部署,以准备项目的obj文件夹中的Web应用程序文件,然后似乎对这些文件进行了手动复制(即,在MSBuild外部)到目标发布文件夹中。这确实是一种不道德的行为,因为MSBuild旨在复制文件(以及其他与构建相关的东西),因此,如果整个过程只是VS2010调用的一个MSBuild目标,而不是目标,然后是手动复制,则是有意义的。
这意味着通过命令行上的MSBuild进行操作并不像使用特定目标调用项目文件并设置一些属性那样简单。您需要做VS2010应该做的事情:自己创建一个执行半部署的目标,然后将结果复制到目标文件夹中。若要编辑项目文件,请在VS2010中右键单击该项目,然后单击“卸载项目”,然后再次右键单击并单击“编辑”。向下滚动,直到找到导入Web应用程序目标的Import元素(Microsoft.WebApplication.targets;此文件本身导入前面提到的Microsoft.Web.Publishing.targets文件)。在此行下面,我们将添加一个名为PublishToFileSystem的新目标:
<Target Name="PublishToFileSystem"
DependsOnTargets="PipelinePreDeployCopyAllFilesToOneFolder">
<Error Condition="'$(PublishDestination)'==''"
Text="The PublishDestination property must be set to the intended publishing destination." />
<MakeDir Condition="!Exists($(PublishDestination))"
Directories="$(PublishDestination)" />
<ItemGroup>
<PublishFiles Include="$(_PackageTempDir)\**\*.*" />
</ItemGroup>
<Copy SourceFiles="@(PublishFiles)"
DestinationFiles="@(PublishFiles->'$(PublishDestination)\%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="True" />
</Target>
此目标取决于PipelinePreDeployCopyAllFilesToOneFolder目标,VS2010在进行手动复制之前会调用该目标。在Microsoft.Web.Publishing.targets中进行的一些挖掘显示,调用此目标会导致将项目文件放入属性_PackageTempDir指定的目录中。
我们在目标中调用的第一个任务是错误任务,在该任务上我们放置了一个条件,以确保仅在未设置PublishDestination属性的情况下才执行该任务。如果您忘记了指定PublishDestination属性,这将使您陷入困境,并出错。然后,如果尚未存在该PublishDestination目录,则调用MakeDir任务来创建该目录。
然后,我们定义一个名为PublishFiles的项目,该项目代表在_PackageTempDir文件夹下找到的所有文件。然后调用复制任务,该任务会将所有这些文件复制到“发布目标”文件夹中。Copy元素上的DestinationFiles属性有点复杂。它执行项目的转换,并将其路径转换为以PublishDestination文件夹为根的新路径(请查看“众所周知的项目元数据”以了解这些%()的含义)。
要从命令行调用此目标,我们现在可以简单地执行以下命令(显然更改项目文件名和属性以适合您):
msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:\Temp\Publish" /t:PublishToFileSystem
Condition="false"
存在条件导入以实现向后兼容。VS2010要求此导入存在,即使由于伪造条件而被跳过。如果再次查看,则会发现csproj包含另一个导入,$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets
该导入可解析为当前版本的Visual Studio的目标文件。