我刚刚在这里写了另一种方法:
http://mikehadlow.blogspot.com/2009/06/tfs-build-publishedwebsites-for-exe-and.html http://mikehadlow.blogspot.com/2009/06/tfs-build-publishedwebsites-for-exe-and.html但如果您懒得点击链接,这里是完整的:
通常,最好的做法是在单个超级解决方案中收集团队控制下的所有代码,如模式和实践 PDF《使用 TFS 进行团队开发指南》中所述。如果您随后配置 TFS 构建服务器来构建此解决方案,则它的默认行为是将构建输出放入单个文件夹“Release”中。
解决方案中的任何 Web 应用程序项目也将输出到名为 _PublishedWebsites\ 的文件夹中。这非常好,因为这意味着您可以简单地通过 robocopy 部署 Web 应用程序。
不幸的是,其他项目类型(例如 WinForms、控制台或库)没有类似的默认行为。如果我们可以有一个 _PublishedApplications\ 子文件夹,其中包含任何选定项目的输出,那就太好了。幸运的是,这并不难做到。
_PublishedWebsites 的工作方式非常简单。如果您查看 Web 应用程序的项目文件,您会注意到底部附近有一个导入:
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v9.0\WebApplications\Microsoft.WebApplication.targets" />
在我的计算机上,MSBuildExtensionsPath 属性的计算结果为 C:\Program Files\MSBuild,如果我们打开 Microsoft.WebApplication.targets 文件,我们可以看到它是一个非常简单的 MSBuild 文件,可以识别构建何时不是桌面构建,即它是一个TFS 构建,并将输出复制到:
$(OutDir)_PublishedWebsites\$(MSBuildProjectName)
我只是复制了 Micrsoft.WebApplication.targets 文件,使用项目文件中的相对路径将其置于源代码管理之下,并将 _PublishedWebsites 更改为 _PublishedApplications,并将文件重命名为 CI.exe.targets。对于我想要输出到 _PublishedApplications 的每个项目,我只需在项目文件的底部添加此导入:
<Import Project="<your relative path>\CI.exe.targets" />
您可以编辑 CI.exe.targets (或任何您想要的名称)来执行您的命令。就我而言,到目前为止唯一的更改是添加几行来复制 App.config 文件:
<Copy SourceFiles="$(OutDir)$(TargetFileName).config" DestinationFolder="$(WebProjectOutputDir)\bin" SkipUnchangedFiles="true" />
Microsoft.WebApplication.targets 中有很多内容仅与 Web 应用程序相关,可以针对其他项目类型进行删除,但我将其作为练习留给读者。