2008-09-18 81 views
7

我们希望将重写的构建目标存储在外部文件中,并将该目标文件包含在TFSBuild.proj中。我们有一个核心集合步骤发生,并希望通过简单地将导入行添加到由向导创建的TFSBuild.proj来获取这些附加步骤。TFSBuild.proj和导入外部目标

<Import Project="$(SolutionRoot)/libs/my.team.build/my.team.build.targets"/> 

我们不能在$(SolutionRoot)上的任何文件的导入,因为在导入语句进行验证时,源并没有被从仓库中取出。它看起来像TFS拉下TFSBuild.proj第一没有任何其他文件。

即使我们添加了条件导入,源控件中的版本也不会被导入(如果存在)。已经存在于磁盘上的以前版本将被导入。

我们可以放弃使用源代码来存储这些构建目标,但它是第一个从源代码树移出的依赖项,所以我们不愿意这样做。

是否有到任何一个办法:

  1. 泰尔团队建设拉下几个文件,所以那些Import陈述正确的评价?
  2. Import之外的方式覆盖那些团队构建目标,如AfterCompile
  3. 最终在Team Build中运行构建目标,这些目标保存在要构建的源代码之下?

回答

16

Team Build有一个“引导程序”阶段,Team Build Configuration文件夹中的所有内容(包含TFSBuild.proj的文件夹)都从版本控制中下载。这是由构建代理在构建代理调用MSBuild.exe告诉它运行TFSBuild.proj之前执行的。

如果从移动你的目标文件SolutionRoot下,并将其放置在您的配置文件夹旁边的TFSBuild.proj文件,然后你就可以将其导入使用相对import语句您的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" /> 

请注意,如果你有多个生成代理,你必须记住设置在所有计算机上的此设置,它会影响通过生成代理执行的每一个建造 - 所以真的是最好的只是为了将文件保留在构建配置文件夹的根目录下(如果可以的话)。

祝你好运,

马丁。

+0

马丁......你是我的英雄。 2次我问了问题,2次你是唯一一个有效答案。你摇滚! – 2009-06-16 19:10:56

1

如果在TFS正在运行的构建,而不是在本地开发机器上的目标应该只运行,你可以把你的目标文件生成自身的文件夹中,并引用它:

<Import Project="$(MSBuildProjectDirectory)\my.team.build.targets.proj" /> 

但是,如果你想要的目标来运行所有版本,您可以将它设置,使得各个项目中引用它通过添加类似:

<Import Project="$(SolutionRoot)/libs/my.team.build/my.team.build.targets" Condition="Exists('$(SolutionRoot)/libs/my.team.build/my.team.build.targets')" /> 

在我的项目中,我们实际使用这两种时,首先允许我们可以定制每晚构建,以便在运行完整解决方案编译之前和之后执行额外步骤,另一个允许按项目进行自定义。

+2

第一个选项需要的目标是源头控制,第二个会无法运行当前版本的对象之外。只有以前。它仍然会导入_before_源文件。 – Mark 2008-09-18 23:46:56

0

如果您创建一个覆盖目标文件来导入并将其称为类似于TeamBuildOverrides.targets的东西,并将其放在源代码管理中的TFSBuild.proj为您的构建类型居住的同一文件夹中,它将首先被提取并可用于导入到TFSBuild.proj文件中。默认情况下,TFSBuild.proj文件直接添加到项目根文件夹下Source Control的TeamBuildTypes文件夹中。

使用下面的import语句在您的TFSBuild.proj文件:

<Import Project="$(MSBuildProjectDirectory)\TeamBuildOverrides.targets" /> 

确保你没有任何重复覆盖在您的TFSBuild.proj文件或进口替代将不会被解雇。