7

我们希望将覆盖的构建目标存储在外部文件中,并将该目标文件包含在 TFSBuild.proj 中。我们有一组核心步骤发生,并且希望通过简单地将导入行添加到向导创建的 TFSBuild.proj 来获得这些额外的步骤。

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

我们无法对 中的任何文件进行导入,$(SolutionRoot)因为在验证 Import 语句时,尚未从存储库中获取源。看起来 TFS 正在拉下第TFSBuild.proj一个没有任何其他文件的文件。

即使我们添加条件导入,如果存在源代码管理中的版本,也不会被导入。将导入磁盘上已存在的先前版本。

我们可以放弃将这些构建目标与我们的源代码一起存储,但它是第一个从源代码树中移出的依赖项,因此我们不愿意这样做。

有没有办法:

  1. 告诉 Team Build 拉下更多文件,以便Import正确评估这些语句?
  2. 以除?AfterCompile之外的方式覆盖那些 Team Build 目标。Import
  3. 最终在 Team Build 中运行构建目标,这些目标保存在它试图构建的源代码下?
4

3 回答 3

16

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 \私人组件)

<add key="ConfigurationFolderRecursionType" value="Full" />

请注意,如果您有多个构建代理,您必须记住在所有机器上设置此设置,它会影响该构建代理执行的每个构建 - 所以实际上最好将文件保留在根目录中如果可以的话,构建配置文件夹。

祝你好运,

马丁。

于 2008-09-19T08:29:34.077 回答
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')" />

在我的项目中,我们实际上使用了这两者,第一个允许我们自定义夜间构建,以便我们可以在运行完整解决方案编译之前和之后执行额外的步骤,第二个允许逐个项目自定义。

于 2008-09-18T22:05:32.643 回答
0

如果您创建要导入的覆盖目标文件并将其命名为 TeamBuildOverrides.targets 之类的名称,并将其放在源代码控制中 TFSBuild.proj 为您的构建类型所在的同一文件夹中,它将首先被拉取并可以导入到 TFSBuild .proj 文件。默认情况下,TFSBuild.proj 文件会直接添加到项目根文件夹下的源代码管理中的 TeamBuildTypes 文件夹中。

在 TFSBuild.proj 文件中使用以下导入语句:

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

确保您的 TFSBuild.proj 文件中没有任何重复的覆盖,否则导入的覆盖将不会被触发。

于 2008-09-19T05:32:35.563 回答