关于tfs:TFSBuild.proj和导入外部目标

关于tfs:TFSBuild.proj和导入外部目标

TFSBuild.proj and Importing External Targets

我们希望将覆盖的构建目标存储在外部文件中,并将该目标文件包含在TFSBuild.proj中。我们有一个设置好的核心步骤,希望通过将导入行添加到向导创建的TFSBuild.proj中来获得这些附加步骤。

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

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

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

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

有没有一种方法可以:

  • 告诉Team Build再拉几个文件,以便那些Import语句正确评估?
  • 是否以除Import之外的方式覆盖诸如AfterCompile之类的团队建设目标?
  • 最终在Team Build中运行构建目标,这些目标是否保留在尝试构建的源代码下?

  • Team Build处于"引导"阶段,在该阶段中,Team Build Configuration文件夹(带有TFSBuild.proj的文件夹)中的所有内容都从版本控制中下载。在构建代理调用MSBuild.exe告诉它运行TFSBuild.proj之前,此过程由构建代理执行。

    如果您将目标文件从SolutionRoot下移到TFSBuild.proj文件旁边的配置文件夹中,则可以使用相对导入语句将其导入TFSBuild.proj文件中。

    1
    <Import Project="myTeamBuild.targets"/>

    如果这些目标依赖于任何其他自定义MSBuild任务程序集,则还可以将它们与TFSBuild.proj文件放在同一文件夹中,并且可以使用相对路径轻松引用它们。

    请注意,在TFS2008中,构建配置文件夹默认位于$ / TeamProject / TeamBuildTypes下,但是它不必在那里。它实际上可以存在于您的解决方案内部的文件夹中,甚至可以是您的解决方案中专门用于Team Build的项目。这具有几个优点,包括使构建的分支更容易。因此,我通常将构建文件放在这样的文件夹中:

    1
    $/TeamProject/main/MySolution/TeamBuild

    还要注意,默认情况下,在构建的引导阶段,构建代理将仅下载构建配置文件夹中的文件,并且不会递归到任何子文件夹中。如果希望它在引导阶段将文件包含在子文件夹中,则可以在构建代理机器上的tfsbuildserver.exe.config文件的appSettings中设置以下属性(位于%ProgramFiles%\ Visual Studio 9.0 \ Common7 \ IDE中) \ PrivateAssemblies)

    1
     

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

    祝好运,

    马丁


    如果仅在TFS运行构建时而不是在本地开发计算机上运行目标,则可以将目标文件放在构建本身的文件夹中,并使用以下命令进行引用:

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

    但是,如果要使目标针对所有构建版本运行,则可以对其进行设置,以便各个项目通过添加以下内容来引用它:

    1
    <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文件中使用以下导入语句:

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

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


    推荐阅读