我将一个大型代码库放入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 但是如果你不愿意关注这个链接,这里就是完整的:
通常,良好的做法是在单一的超级解决方案中收集团队控制下的所有代码,如本模式和实践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应用程序相关,并且可以被剥离出来用于其他项目类型,但我会将其作为读者的练习.
我喜欢这个解决方案......
编辑您的构建定义.在"处理"部分下,设置MSBuild arguments
为
/p:GenerateProjectSpecificOutputFolder=true
像这样:
默认情况下,每个项目文件(*.csproj,*.vbproj等)都指定一个默认输出目录(通常是bin\Debug,bin\Release等).Team Build实际上覆盖了这一点,因此您不必随意了解开发人员在项目文件中设置的属性,而且还可以让Team Build可以对输出的位置做出假设.
覆盖此行为的最简单方法是在SolutionToBuild项目组中将CustomizableOutDir设置为true,如下所示:
CustomizableOutDir=true
如果构建解决方案,这将使drop文件夹结构大致与本地获取的结构相匹配.
这种方法绝对比覆盖可能导致升级问题的Core*目标更可取.
对于每个SolutionToBuild节点,将属性OutDir设置为$(OutDir)\ SubFolder
例如:
OutDir=$(OutDir)\Project1\ OutDir=$(OutDir)\Project2\ OutDir=$(OutDir)\Project3\
(这适用于TF2008,但不适用于TF2005.)
我回答这个问题的时候有点晚了但是有一个非常简单的方法可以实现Mike Hadlows的答案.有人编写了一个与迈克谈论的完全一致的nuget包.你可以在这里找到它:http://www.nuget.org/packages/PublishedApplications