当前位置:  开发笔记 > 后端 > 正文

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

如何解决《让TFS将每个项目输出到自己的目录的最佳方法是什么?》经验,为你挑选了5个好方法。

我将一个大型代码库放入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特定的文件中)



1> Mike Hadlow..:

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

http://mikehadlow.blogspot.com/2009/06/tfs-build-publishedwebsites-for-exe-and.html 但是如果你不愿意关注这个链接,这里就是完整的:

通常,良好的做法是在单一的超级解决方案中收集团队控制下的所有代码,如本模式和实践PDF,团队开发与TFS指南中所述.如果您随后配置TFS构建服务器以构建此解决方案,则默认行为是将构建输出放置在单个文件夹"Release"中.

解决方案中的任何Web应用程序项目也将输出到名为_PublishedWebsites \的文件夹中.这非常好,因为这意味着您可以简单地robocopy部署Web应用程序.

不幸的是,其他项目类型(如WinForms,控制台或库)没有类似的默认行为.如果我们可以拥有一个带有任何所选项目输出的_PublishedApplications\sub文件夹,那将是非常好的.幸运的是,这并不难.

_PublishedWebsites的工作方式非常简单.如果查看Web应用程序的项目文件,您会注意到底部附近的导入:


在我的机器上,MSBuildExtensionsPath属性的计算结果为C:\ Program Files\MSBuild,如果我们打开Microsoft.WebApplication.targets文件,我们可以看到它是一个非常简单的MSBuild文件,它可以识别构建不是桌面构建的时候,即它是一个TFS构建,并将输出复制到:

$(OutDir)_PublishedWebsites\$(MSBuildProjectName)

我只是复制了Micrsoft.WebApplication.targets文件,将其放在源代码控制下,使用来自我的项目文件的相对路径,并将_PublishedWebsites更改为_PublishedApplications并重命名为文件CI.exe.targets.对于我想输出到_PublishedApplications的每个项目,我只是在项目文件的底部添加了这个导入:


您可以编辑CI.exe.targets(或任何您想要的名称)来进行出价.在我的例子中,到目前为止唯一的变化是添加几行来复制App.config文件:


Microsoft.WebApplication.targets中有很多东西只与Web应用程序相关,并且可以被剥离出来用于其他项目类型,但我会将其作为读者的练习.



2> Theo..:

TFS 2012+

我喜欢这个解决方案......

编辑您的构建定义.在"处理"部分下,设置MSBuild arguments

/p:GenerateProjectSpecificOutputFolder=true

像这样:

在此输入图像描述



3> 小智..:

默认情况下,每个项目文件(*.csproj,*.vbproj等)都指定一个默认输出目录(通常是bin\Debug,bin\Release等).Team Build实际上覆盖了这一点,因此您不必随意了解开发人员在项目文件中设置的属性,而且还可以让Team Build可以对输出的位置做出假设.

覆盖此行为的最简单方法是在SolutionToBuild项目组中将CustomizableOutDir设置为true,如下所示:


  
    CustomizableOutDir=true
  

如果构建解决方案,这将使drop文件夹结构大致与本地获取的结构相匹配.

这种方法绝对比覆盖可能导致升级问题的Core*目标更可取.


有关如何在TFS 2010中使用基于工作流的构建过程执行此操作的任何提示,现在TFSBuild.Proj已过时了吗?

4> user75810..:

对于每个SolutionToBuild节点,将属性OutDir设置为$(OutDir)\ SubFolder
例如:

  
   
    OutDir=$(OutDir)\Project1\      
   
   
    OutDir=$(OutDir)\Project2\      
   
   
    OutDir=$(OutDir)\Project3\      
   
  

(这适用于TF2008,但不适用于TF2005.)



5> CeejeeB..:

我回答这个问题的时候有点晚了但是有一个非常简单的方法可以实现Mike Hadlows的答案.有人编写了一个与迈克谈论的完全一致的nuget包.你可以在这里找到它:http://www.nuget.org/packages/PublishedApplications

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有