我们希望将覆盖的构建目标存储在外部文件中,并将该目标文件包含在 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. 覆盖那些 Team Build 目标,例如 AfterCompile 以某种方式除了 Import?
  3. 最终在 Team 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 \私人集会)

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

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

祝你好运,

马丁.

其他提示

如果目标只能在 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')" />

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top