模块化TeamBuilds

时间:2009-06-10 20:11:16

标签: tfs msbuild build-automation team-build

我有3个TFS Builds(2 Dev和1 Cert)。

我想模块化这些版本,所以每次我对常用项目进行更改时都不需要编辑3个文件。

我遇到的问题是Team Build只会自动检索构建文件夹(TeamBuildTypes下)中的项目。我可以在构建过程中输入代码来获取其他文件,但到那时为时已晚。

这是我的情景。我为常见任务创建了“通用”位置。然后我去了,并对该文件进行了更改。因为在我的构建过程告诉它下载之前文件没有下载,所以检索得太晚(导入已经发生并且MSBuild进程已经在内存中构建了构建目标)。

我考虑将它添加到构建工作区,但随后它将在Get Sources目标中检索(这也太晚了)。

我看不到一个不会让我复制文件或不使用源代码控制的解决方案......

任何想法?

2 个答案:

答案 0 :(得分:4)

Team Build 2008中没有针对此问题的“理想”解决方案,您最好的选择是将常见内容放在$(MSBuildExtensionsPath)中的构建计算机上,然后解析为C:\Program Files\MSBuild,然后从那里引用它们

如果您的构建配置非常类似,您可以:

  1. 将所有构建定义指向单个配置文件夹。
  2. 将公共构建逻辑放在TFSBuild.proj
  3. 在TFSBuild.proj的底部添加<Import Project="TFSBuild.$(BuildDefinitionName).proj" />
  4. 在TFSBuild中添加不同构建定义的配置。<BuildDefinitionName>.proj

答案 1 :(得分:3)

  
    

你最好的选择是将常见的东西放在$(MSBuildExtensionsPath)的构建机器上,它解析为C:\ Program Files \ MSBuild

  

我不喜欢依赖“神奇”的位置。您最终需要第二次部署+ QA流程才能使您的构建脚本保持同步...

  
    

Team Build只会自动检索构建文件夹(TeamBuildTypes下)中的项目。

  
但是,有点蹩脚,但我并没有发现它在实践中是一个主要的限制。这是我的TeamBuild文件夹的简化外观:

$/TeamProject
   |- Dev
       |- Module1
       |- Module2
       ...
       Solution1.sln
       Solution2.sln
       |- TeamBuild
            |- 3rdparty
                MSBuild.Community.Tasks.dll
                MSBuild.Community.Tasks.targets
                RandomScriptOffTheWeb1.targets
                ...
            |- SrcSrv                
                srcsrv.ini
                ...
            |- SymStor
                dbghelp.dll
                ...
            Common.targets
            TFSBuild.proj
            TFSBuild.Common.targets
            TFSBuild.Config1.targets
            ...
            UtilityScript1.ps1
            ...
   |- Main           
       ...
       |- TeamBuild
       ...
   |- Release
       ...

Common.targets由所有* .csproj(etc)文件导入。它导入我的所有第三方任务,初始化各种全局属性/项目,并设置引用路径。

TFSBuild.proj通过调整$(BuildDefinition)导入Common.targets,然后导入TFSBuild.proj,然后导入其中一个配置文件。这样,更具体的总是根据需要从不太具体的文件覆盖任务/属性/等。尽管如此,这个短文件是我觉得有限的地方:以编程方式将构建名称映射到文件名会更好,但MSBuild不会让我[[declarative]导入依赖于[runtime]目标中设置的属性

TFSBuild.Config * .targets文件大部分只设置属性;没有“真实”的工作。这些包含我想要参数化的Team Build属性,以及控制我的自定义目标(在其他地方实现)如何工作的其他属性。

TFSBuild.Common.targets是一个数量级的最长文件。在这里,我将所有Team Build属性配置为具有良好的默认值,覆盖AfterDropBuild之类的目标,并定义许多我自己的自定义目标,这些目标根据Config *文件中的设置有条件地执行。

注意:我显然已启用recursive download option,但并非严格要求。将构建依赖关系分离到子文件夹更符合美学要求。