我们希望将覆盖的构建目标存储在外部文件中,并将该目标文件包含在TFSBuild.proj中。我们有一个设置好的核心步骤,希望通过将导入行添加到向导创建的TFSBuild.proj中来获得这些附加步骤。
<Import Project="$(SolutionRoot)/libs/my.team.build/my.team.build.targets"/>
我们无法在
$(SolutionRoot)
中的任何文件上进行导入,因为在验证Import语句时,尚未从存储库中获取源。看起来TFS首先拉下了TFSBuild.proj
而没有任何其他文件。即使我们添加条件导入,如果存在,也不会导入源代码管理中的版本。磁盘上已经存在的先前版本将被导入。
我们可以放弃将这些构建目标与源一起存储,但这是移出源树的第一个依赖项,因此我们不愿意这样做。
有没有一种方法可以:
Import
语句正确评估吗? AfterCompile
之外,还以Import
之类的方式覆盖那些团队 build 目标吗? 最佳答案
Team Build 有一个“引导”阶段,其中 Team Build Configuration 文件夹(包含 TFSBuild.proj 的文件夹)中的所有内容都从版本控制中下载。这是在构建代理调用 MSBuild.exe 告诉它运行 TFSBuild.proj 之前由构建代理执行的。
如果您从 SolutionRoot 下移动您的目标文件并将其放置在 TFSBuild.proj 文件旁边的配置文件夹中,您将能够使用相对导入语句将其导入到 TFSBuild.proj 文件中,即
<Import Project="myTeamBuild.targets"/>
如果这些目标依赖于任何其他自定义 MSBuild 任务程序集,那么您还可以将它们与 TFSBuild.proj 文件放在同一文件夹中,并且您可以使用相对路径轻松引用它们。
请注意,在 TFS2008 中,构建配置文件夹默认位于 $/TeamProject/TeamBuildTypes 下,但是,它不必在那里。它实际上可以位于您的解决方案内的文件夹中 - 甚至可以是您的解决方案中专用于 Team Build 的项目。这有几个优点,包括使构建的分支更容易。因此,我的构建通常位于这样的文件夹中:
$/TeamProject/main/MySolution/TeamBuild
另请注意,默认情况下,在构建的引导阶段,构建代理将仅下载构建配置文件夹中的文件,而不会向下递归到任何子文件夹。如果您希望它在引导阶段包含子文件夹中的文件,那么您可以在构建代理计算机上的 tfsbuildserver.exe.config 文件的 appSettings 中设置以下属性(位于 %ProgramFiles%\Visual Studio 9.0\Common7\IDE\PrivateAssemblies)
<add key="ConfigurationFolderRecursionType" value="Full" />
请注意,如果您有多个构建代理,您必须记住在所有机器上设置此设置,并且它会影响该构建代理执行的每个构建 - 所以实际上最好只是将文件保存在根目录中如果可以,请构建配置文件夹。
祝你好运,
马丁。
关于TFSBuild.proj 和导入外部目标,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/97349/