题
我们希望将覆盖的构建目标存储在外部文件中,并将该目标文件包含在 TFSBuild.proj 中。我们有一组发生的核心步骤,并且希望通过简单地将导入行添加到向导创建的 TFSBuild.proj 来获得这些附加步骤。
<Import Project="$(SolutionRoot)/libs/my.team.build/my.team.build.targets"/>
我们无法导入任何文件 $(SolutionRoot)
因为在验证 Import 语句时,尚未从存储库中获取源。看起来 TFS 正在拉低 TFSBuild.proj
首先没有任何其他文件。
即使我们添加条件导入,源代码管理中的版本(如果存在)也不会被导入。将导入磁盘上已存在的先前版本。
我们可以放弃将这些构建目标与源一起存储,但这是第一个从源树中移出的依赖项,因此我们不愿意这样做。
有没有办法:
- 告诉 Team Build 再拉取一些文件,以便这些文件
Import
语句评估正确吗? - 覆盖那些 Team Build 目标,例如
AfterCompile
以某种方式除了Import
? - 最终在 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 文件中没有任何重复的覆盖,否则导入的覆盖不会被触发。