我们希望将重写的构建目标存储在外部文件中,并在TFSBuild.proj中包含该目标文件。我们有一个核心设置步骤,只需将导入行添加到向导创建的TFSBuild.proj即可获得这些额外步骤。
<Import Project="$(SolutionRoot)/libs/my.team.build/my.team.build.targets"/>
我们无法对$(SolutionRoot)
中的任何文件进行导入,因为在验证Import语句时,尚未从存储库中获取源。看起来TFS首先拉下TFSBuild.proj
而没有任何其他文件。
即使我们添加条件导入,如果存在,也不会导入源代码管理中的版本。将导入已存在于磁盘上的先前版本。
我们可以放弃使用源代码存储这些构建目标,但它是第一个移出源代码树的依赖项,因此我们不愿意这样做。
有没有办法:
Import
个语句?AfterCompile
以外的方式覆盖Import
之类的团队构建目标?答案 0 :(得分:16)
Team Build有一个“bootstrap”阶段,其中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中) \ PrivateAssemblies)
<add key="ConfigurationFolderRecursionType" value="Full" />
请注意,如果您有多个构建代理,则必须记住在所有计算机上设置此设置,这会影响该构建代理执行的每个构建 - 所以最好只保留文件如果可以的话,构建配置文件夹的根目录。
祝你好运,马丁。
答案 1 :(得分: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')" />
在我的项目中,我们实际使用这两个,第一个允许我们自定义每晚构建,以便我们可以在运行完整解决方案编译之前和之后执行额外的步骤,第二个允许逐个项目定制。
答案 2 :(得分:0)
如果您创建要导入的覆盖目标文件并将其调用类似TeamBuildOverrides.targets并将其放在TFSBuild.proj为您的构建类型所在的源代码管理中的同一文件夹中,则会先将其拉出并可用于导入进入TFSBuild.proj文件。默认情况下,TFSBuild.proj文件直接添加到源代码管理中的TeamBuildTypes文件夹中,直接位于项目的根文件夹下。
在TFSBuild.proj文件中使用以下import语句:
<Import Project="$(MSBuildProjectDirectory)\TeamBuildOverrides.targets" />
确保您的TFSBuild.proj文件中没有任何重复覆盖,否则导入的覆盖不会被触发。