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的新目标:
DependsOnTargets="PipelinePreDeployCopyAllFilesToOneFolder">
Text="The PublishDestination property must be set to the intended publishing destination." />
Directories="$(PublishDestination)" />
DestinationFiles="@(PublishFiles->'$(PublishDestination)\%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="True" />
此目标取决于PipelinePreDeployCopyAllFilesToOneFolder目标,这是VS2010在进行手动复制之前调用的目标 . 在Microsoft.Web.Publishing.targets中进行一些挖掘表明,调用此目标会导致项目文件被放置在属性_PackageTempDir指定的目录中 . 我们在目标中调用的第一个任务是Error任务,我们在其上放置了一个条件,确保只有在尚未设置PublishDestination属性的情况下才会执行任务 . 如果您忘记指定PublishDestination属性,这将捕获您并错误地构建 . 然后,我们调用MakeDir任务来创建该PublishDestination目录(如果该目录尚不存在) . 然后我们定义一个名为PublishFiles的Item,它表示在_PackageTempDir文件夹下找到的所有文件 . 然后调用复制任务,将所有这些文件复制到“发布目标”文件夹 . Copy元素上的DestinationFiles属性有点复杂;它执行项目的转换并将其路径转换为以PublishDestination文件夹为根的新路径(查看已知项目元数据以查看那些%()的含义) . 要从命令行调用此目标,我们现在可以简单地执行此命令(显然更改项目文件名和属性以适合您):
msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:\Temp\Publish" /t:PublishToFileSystem