在这里找到答案:
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 Publish To File System 对话框 Publish to File System 花了我一段时间才弄清楚,因为我预计 MSBuild 会发生一些合理的使用。相反,VS2010 做了一些非常奇怪的事情:它调用 MSBuild 执行一种半部署,在项目的 obj 文件夹中准备 Web 应用程序的文件,然后它似乎手动复制这些文件(即在 MSBuild 之外)进入您的目标发布文件夹。这确实是一种糟糕的行为,因为 MSBuild 旨在复制文件(以及其他与构建相关的东西),所以如果整个过程只是 VS2010 调用的一个 MSBuild 目标,而不是手动复制的目标,那将是有意义的。
这意味着通过命令行上的 MSBuild 执行此操作并不像使用特定目标调用项目文件并设置一些属性那么简单。您需要做 VS2010 应该做的事情:自己创建一个执行半部署的目标,然后将结果复制到目标文件夹。要编辑您的项目文件,请在 VS2010 中右键单击项目并单击 Unload Project,然后再次右键单击并单击 Edit。向下滚动,直到找到导入 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 指定的目录中。
我们在目标中调用的第一个任务是 Error 任务,我们在其上设置了一个条件,以确保该任务仅在未设置 PublishDestination 属性时发生。如果您忘记指定 PublishDestination 属性,这将捕获您并错误生成构建。然后我们调用 MakeDir 任务来创建该 PublishDestination 目录(如果它尚不存在)。
然后我们定义一个名为 PublishFiles 的项目,它代表在 _PackageTempDir 文件夹下找到的所有文件。然后调用复制任务,将所有这些文件复制到发布目标文件夹。Copy 元素的 DestinationFiles 属性有点复杂。它执行项目的转换并将它们的路径转换为以 PublishDestination 文件夹为根的新路径(查看 Well-Known Item Metadata 以了解这些 %()s 的含义)。
要从命令行调用此目标,我们现在可以简单地执行此命令(显然更改项目文件名和属性以适合您):
msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:\Temp\Publish" /t:PublishToFileSystem