TFS build 2008 - BuildNumberOverrideTarget DependsOn没有以正确的顺序执行初始构建

时间:2009-11-19 11:48:27

标签: tfs2008 tfsbuild

我已经创建了一个tfsbuild.proj文件来构建我的解决方案的发行版本,并在其中我为BuildNumberOverrideTarget创建了一个自定义目标,用于处理自定义版本控制。我将版本号存储在TFS的文件位置,自定义任务将获取版本号,检查assemblyinfo.cs文件,编辑版本详细信息,签入然后增加下一版本的版本号。

这一切都运行正常,但只有在TFS第一次构建之前,在将版本控制更改添加到tfsbuild.proj文件之前,它就好像它依赖于Sources \ directory结构已经存在于早期版本中。因此,如果您决定分支源并按原样运行构建,它将失败并出现一个奇怪的错误,如:

Target "InitializeWorkspace" skipped. Previously built successfully.
Target "BuildNumberOverrideTarget" in file "e:\tfstemp\TestProject\TestProject MainBranch Release\BuildType\TFSBuild.proj" from project "e:\tfstemp\TestProject\TestProject MainBranch Release\BuildType\TFSBuild.proj":
Task "Message"
  Loading last build number from file "e:\tfstemp\TestProject\TestProject MainBranch Release\BuildType\..\Sources\Version Number\buildnumber.txt"
Done executing task "Message".
Using "Exec" task from assembly "Microsoft.Build.Tasks.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
Task "Exec"
  Command:
  "C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies\..\tf.exe" get /force /noprompt /overwrite buildnumber.txt
e:\tfstemp\TestProject\TestProject MainBranch Release\BuildType\TFSBuild.proj(472,5): error MSB6003: The specified task executable "cmd.exe" could not be run. The directory name is invalid
Done executing task "Exec" -- FAILED.
Done building target "BuildNumberOverrideTarget" in project "TFSBuild.proj" -- FAILED.
Done Building Project "e:\tfstemp\TestProject\TestProject MainBranch Release\BuildType\TFSBuild.proj" (EndToEndIteration target(s)) -- FAILED.

Build FAILED.

经过一番研究后,我找到了以下网站,其中指出如果要覆盖内部版本号目标,则排序不正确。它建议重新指定执行顺序或将DependsOnTarget添加到BuildNumberOverrideTarget。

http://social.msdn.microsoft.com/forums/en-US/tfsbuild/thread/9103c92d-4b03-41d4-9eae-93c78cb6ea3a/

我在帖子中尝试了两个建议,但我似乎无法让它运行,构建错误似乎跳过了InitializeWorkspace。

我有一个部分有效的解决方法,但我们会看到有关工作空间不存在的分支区域的错误。我们的解决方法是使用以下对tfsbuild.proj文件的编辑在BuildNumberOverrideTarget中创建目录结构:

<Target Name="BuildNumberOverrideTarget">
    <!-- Create a custom build number, matching the assembly version -->
    <Message Text="Loading last build number from file &quot;$(MSBuildProjectDirectory)\..\Sources\Version Number\buildnumber.txt&quot;" />

    <!--need to ensure that the sources folder exists-->
    <PropertyGroup>
      <SourcesDirectory>$(MSBuildProjectDirectory)\..\Sources\Version Number</SourcesDirectory>
    </PropertyGroup>
    <MakeDir Directories="$(SourcesDirectory)"/>

    <Exec Command="$(TF) get /force /noprompt /overwrite buildnumber.txt"
          WorkingDirectory="$(MSBuildProjectDirectory)\..\Sources\Version Number\">
    </Exec>

    <Exec Command="$(TF) checkout buildnumber.txt"
      WorkingDirectory="$(MSBuildProjectDirectory)\..\Sources\Version Number\" IgnoreExitCode="true">
    </Exec>
  ... rest omitted to keep short...
</Target>

在尝试运行任何自定义目标之前,有没有办法可以强制msbuild运行以自动获取整个源结构?我们正在进行发布构建,我不喜欢它可能尝试缓存旧版本的文件和文件夹结构。

非常感谢,

艾玛

1 个答案:

答案 0 :(得分:0)

我不确定这是否适用于TFS 2008,但我能够通过设置以下依赖项来解决TFS 2010中的这个问题:

<Target Name="BuildNumberOverrideTarget" DependsOnTargets="CoreInitializeWorkspace;CoreCleanAll;CoreGet">

您需要所有3个依赖项:

  • CoreInitializeWorkspace只创建工作区,但不会获取任何文件
  • CoreGet获取文件,这就是我们想要的内容
  • CoreCleanAll用于清除以前版本中的旧代码。如果我们不依赖它,那么它将在 CoreGet之后运行,并删除我们刚检出的所有代码,然后构建将失败,因为它没有编译代码:-)