tfs - 让 TFS 将每个项目输出到其自己的目录的最佳方法是什么?

标签 tfs msbuild

我正在将大型代码库放入 Team Foundation Server 中。我希望构建过程能够创建我们项目的“准备部署”版本。

我们执行此操作的正常方法是将每个项目的输出放在其自己的文件夹中。因此,例如,我们最终会得到类似的东西

C:\project1\
            assembly1.dll
            assembly2.dll
            project1.exe
            project1.exe.config
C:\project2\
            assembly2.dll
            assembly3.dll
            project2.exe
            project2.exe.config
C:\project3\
            assembly1.dll
            assembly3.dll
            project3.exe
            project3.exe.config

这就是我们喜欢的方式。

不过,TFS 似乎希望将所有内容都放在同一目录中。

C:\output\
          assembly1.dll
          assembly2.dll
          assembly3.dll
          project1.exe
          project1.exe.config
          project2.exe
          project2.exe.config
          project3.exe
          project3.exe.config

虽然它节省了一些磁盘空间(每个程序集仅存在一次),但这并不是我们想要的。

指定 TFS/MSBuild 应将输出文件放置在何处的最佳方法是什么?我是否需要单独编辑 sln/csproj 文件才能实现此目的,还是可以在 TFSBuild.proj 文件中执行此操作? (即在 MSBuild 特定文件中)

最佳答案

我刚刚在这里写了另一种方法:

http://mikehadlow.blogspot.com/2009/06/tfs-build-publishedwebsites-for-exe-and.html 但如果您懒得点击链接,这里是完整的:

通常最好的做法是将团队控制下的所有代码收集到单个 super 解决方案中,如本模式和实践 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 应用程序相关,可以针对其他项目类型进行删除,但我会将其作为练习留给读者。

关于tfs - 让 TFS 将每个项目输出到其自己的目录的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/698855/

相关文章:

visual-studio - TFS 在 Visual Studio for Mac 中是否可用

visual-studio - 通过 TFS Power Tools 2015 添加新状态?

powershell - 如何从命令行获取当前正在运行的 TFS 构建列表?

powershell - 在 powershell 中运行带参数的 TFS 命令

visual-studio-2015 - 使用 visual studio 在线构建定义构建 SSIS 解决方案....dtproj 不受 MSBuild 支持,无法构建

c# - 找不到 CodeDom 提供程序类型 "Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider"

.net - 如何摆脱 msbuild 警告 MSB3644

powershell - 使用api下载TFS构建工件返回401授权错误

c# - 如何从 jenkins 构建 visual studio 安装程序项目 (.vdproj) 以生成 .exe 和 .msi 文件?

c# - MSBuild 试图构建 exe 而不是 dll