您最好的选择是将构建机器上的常见内容放在 $(MSBuildExtensionsPath) 中,解析为 C:\Program Files\MSBuild
我不喜欢依赖“神奇”位置的想法。您最终需要第二次部署 + QA 流程,以保持您的构建脚本同步......
只有构建文件夹中的项目(在 TeamBuildTypes 下)由 Team Build 自动检索。
诚然,有点蹩脚,但我还没有发现它是实践中的主要限制。这是我的 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) 文件导入。它导入我所有的 3rd 方任务,初始化各种全局属性/项目,并设置参考路径。
TFSBuild.proj 导入 Common.targets,然后是 TFSBuild.proj,然后是通过调节 $(BuildDefinition) 的配置文件之一。这样,更具体的总是根据需要从不太具体的文件中覆盖任务/属性/等。尽管如此,这个短文件是我确实感到有限的一个地方:以编程方式将构建名称映射到文件名会更好,但 MSBuild 不会让我使 [declarative] 导入依赖于 [runtime] 目标中设置的属性,例如.
TFSBuild.Config*.targets 文件大部分只设置属性;没有“真正的”工作。这些包括我想要参数化的 Team Build 属性,以及控制我的自定义目标(在其他地方实现)如何工作的其他属性。
TFSBuild.Common.targets 是一个数量级的最长文件。在这里,我使用良好的默认值配置所有 Team Build 属性,覆盖 AfterDropBuild 等目标,并定义许多我自己的自定义目标,这些目标根据 Config* 文件中的设置有条件地执行。
注意:我显然启用了递归下载选项,但这不是严格要求的。将构建依赖项分离到子文件夹中更符合美学要求。