在这里找到了答案:http://www.digitallycreated.net/Blog/59/locally-publishing-a-vs2010-asp.net-web-application-using-msbuild
该链接介绍了如何使用MSBuild本地发布VS2010 ASP.NET Web应用程序。
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应用程序目标(Microsoft.WebApplication.targets)的Import元素;该文件本身导入了前面提到的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指定的目录中。
我们在目标中调用的第一个任务是Error任务,在其上放置了一个条件,以确保只有在未设置PublishDestination属性时才会发生该任务。如果您忘记指定PublishDestination属性,它将捕获您并使构建失败。然后,我们调用MakeDir任务来创建PublishDestination目录(如果不存在)。
然后,我们定义了一个名为PublishFiles的项,它表示在_PackageTempDir文件夹下找到的所有文件。然后调用Copy任务,将所有这些文件复制到Publish Destination文件夹中。Copy元素上的DestinationFiles属性有点复杂;它执行项目的转换,并将其路径转换为以PublishDestination文件夹为根的新路径(请查看Well-Known Item Metadata以了解那些%()s的含义)。
要从命令行调用此目标,现在我们只需执行以下命令(显然更改项目文件名称和属性以适合您):
msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:\Temp\Publish" /t:PublishToFileSystem
$(MSBuildToolsVersion)
,以便考虑正确的 VS 版本:<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(MSBuildToolsVersion)\WebApplications\Microsoft.WebApplication.targets" Condition="false" />
。这在我的 VS2015 Update 1 上起作用。 - Al Dass