我有3个TFS Builds(2 Dev和1 Cert)。
我想模块化这些版本,所以每次我对常用项目进行更改时都不需要编辑3个文件。
我遇到的问题是Team Build只会自动检索构建文件夹(TeamBuildTypes下)中的项目。我可以在构建过程中输入代码来获取其他文件,但到那时为时已晚。
这是我的情景。我为常见任务创建了“通用”位置。然后我去了,并对该文件进行了更改。因为在我的构建过程告诉它下载之前文件没有下载,所以检索得太晚(导入已经发生并且MSBuild进程已经在内存中构建了构建目标)。
我考虑将它添加到构建工作区,但随后它将在Get Sources目标中检索(这也太晚了)。
我看不到一个不会让我复制文件或不使用源代码控制的解决方案......
任何想法?
答案 0 :(得分:4)
Team Build 2008中没有针对此问题的“理想”解决方案,您最好的选择是将常见内容放在$(MSBuildExtensionsPath)
中的构建计算机上,然后解析为C:\Program Files\MSBuild
,然后从那里引用它们
如果您的构建配置非常类似,您可以:
TFSBuild.proj
。<Import Project="TFSBuild.$(BuildDefinitionName).proj" />
。<BuildDefinitionName>.proj
。答案 1 :(得分:3)
你最好的选择是将常见的东西放在$(MSBuildExtensionsPath)的构建机器上,它解析为C:\ Program Files \ MSBuild
我不喜欢依赖“神奇”的位置。您最终需要第二次部署+ QA流程才能使您的构建脚本保持同步...
但是,有点蹩脚,但我并没有发现它在实践中是一个主要的限制。这是我的TeamBuild文件夹的简化外观:Team Build只会自动检索构建文件夹(TeamBuildTypes下)中的项目。
$/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,但并非严格要求。将构建依赖关系分离到子文件夹更符合美学要求。