代码之家  ›  专栏  ›  技术社区  ›  Mark

TfsBuild.proj和导入外部目标

  •  7
  • Mark  · 技术社区  · 17 年前

    我们希望将重写的生成目标存储在外部文件中,并将该目标文件包含在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 在某种程度上除了 进口 ?
    3. 最终在团队构建中运行构建目标,这些目标保存在它试图构建的源代码下?
    3 回复  |  直到 17 年前
        1
  •  16
  •   Martin Woodward    17 年前

    团队构建有一个“引导”阶段,在该阶段中,团队构建配置文件夹(包含tfsbuild.proj的文件夹)中的所有内容都从版本控制下载。生成代理在调用msbuild.exe并告诉它运行tfsbuild.proj之前执行此操作。

    如果您从solutionroot下移动目标文件,并将其放在配置文件夹中的tfsbuild.proj文件旁边,则可以使用相对导入语句将其导入到tfsbuild.proj文件中,即。

    <Import Project="myTeamBuild.targets"/>
    

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

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

    $/TeamProject/main/MySolution/TeamBuild
    

    另外请注意,默认情况下,在生成的引导阶段,生成代理将只下载位于生成配置文件夹中的文件,并且不会递归到任何子文件夹中。如果希望它在引导阶段包含子文件夹中的文件,则可以在生成代理计算机上的tfsbuildserver.exe.config文件的appsettings中设置以下属性(位于%programfiles%\Visual Studio 9.0\common7\ide\privateassembly中)

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

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

    祝你好运,

    马丁。

        2
  •  1
  •   Gregg    17 年前

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

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

        3
  •  0
  •   Mr. Kraus    17 年前

    如果创建要导入的覆盖目标文件并将其命名为类似teambuildOverrides.targets的文件,并将其放在tfsbuild.proj所在的源代码管理中与您的生成类型相同的文件夹中,则该文件将首先被拉入,并可导入到tfsbuild.proj文件中。默认情况下,tfsbuild.proj文件将直接添加到项目根文件夹下的源代码管理中的teambuildtypes文件夹中。

    在tfsbuild.proj文件中使用以下import语句:

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

    确保在tfsbuild.proj文件中没有任何重复的重写,否则导入的重写将不会被激发。